skillup

技術ブログ

Database プログラミング全般

オブジェクト指向 データベース層

投稿日:

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。

本日は主にデータベース層の考え方について。

データべース層

要点

典型的なダメテーブル設計

  • 既存DBの問題点(意味不明なカラム、NULLが入っている、ダブルミーニング、関係がわからない、テーブルが巨大すぎ)
  • 制約(ユニークキーがない、NOT NULLがない、外部キー制約がない)
  • 1つのカラムに複数の意味と思われるデータが入っている
  • テーブル間の関係がしっかりしていない

基本的には下記のリンクでかいたようなネタ

論理設計のアンチパターン その2
論理設計のアンチパターン
データベースアンチパターン・グレーパターンまとめ

対策

  • カラム時の制約を整理(not null,FK,ユニーク他)
  • 記録のタイミングが違う場合はテーブルを分ける
  • UPDATE文をなるべく使わず、INSERTで履歴を追加する
  • カラム追加時はテーブルの分割を考える(ただし非正規化が崩れる)
  • 複数の更新作業は非同期で行ってもよい(ただし複数のサーバー分割などデメリットもあり)
  • 集計はイベントの記録から動的に作成する(ビューや中間テーブルを使わない)
  • オブジェクトとテーブルは似てはいるが違うもの

感想

今回はデータベースがらみの話。結構いろいろな本を読んで勉強しまして、半分以上は知っている話だったんですが、UPDATEを使わないってのは初でしたね。確かに今作ってるアプリでも履歴をつくってデータを消さないってのはあるんですけど、INSERTとDELETEだけってのは聞いたことがありませんでした。私がまだ考えを理解できていないだけかもしれませんが、やや原理主義的な感じもしました。

カラムが増える場合はテーブル分割したほうが良い面もありますね。ただ1:1の構成になりますんで、非正規化は徹底されていないです。メリットデメリットをみることが大事カナと思います。

-Database, プログラミング全般

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

GlassFishでDB接続

一般的にWEB系の言語で、DBを使う場合、WEBサーバーとDBサーバーは単独に動くことが一般的です。 JavaEEではアプリケーションサーバーとしてGlassFishを使いますが、先日、GlassFi …

no image

自己結合に関して

以前もこのエントリーで学習しましたが、SQLの結合では自己結合という考え方があります。 下記のようなテーブルProductsがあるとします。 name | price ——&# …

no image

Cakeでのリレーションについて

いまさらながらCakeのリレーションについての復習。 基本から。 Contents1 基本的なリレーション1.1 1対N1.2 N対11.3 動的な紐づけ 基本的なリレーション 下記のようなテーブル構 …

no image

エンティティの抽出と主キー決定

主に設計に関することのメモ。 Contents1 業務フロー分析2 エンティティの抽出3 エンティティの関連付け4 主キーの抽出を行う4.1 主キーの特徴4.2 サロゲートキーのメリット4.3 サロゲ …

no image

NOT EXISTSの利用2

今回もNOT EXISTSの利用です。 前回の問題にプラスアルファし、列が一緒でないと連続でも意味ない仕様にします。 例えば下記のようなテーブルがあるとします。 seat | row_id | sta …