良いデータベースの設計
一度運用が始まってしまうと、簡単に変更はできません。一番最初に良いデータベースを設計することはとても重要です。
1.目次
2.データの識別
3.データの定義
4.データの整合性チェック
4.1 データの正規化
4.2 ビジネス ルールの定義
4.3 整合性
4.4 データの妥当性検査
5.用語
インタビュー、既存データ構造の分析、ドキュメントの作成、綿密な見直しにより、アプリケーションに必要な "何を、どこで、いつ、なぜ"
という情報を概念的な見地から文書化する。
データ型を割り当てる時の注意
- 許容最大値と最小値
- 既定値
- 空値 (または NULL 値)
- 予想される増加量
- 予想される変更と (可能性のある範囲内での) 突発的変更
|
- データの正規化
- ビジネス ルールの定義
- 参照整合性の適用
- データの妥当性検査
正規化には、第1正規化から第5正規化までありますが、通常第3正規化までで十分です。
正規形 |
定義 |
操作 |
第1正規形 |
第1正規形 |
- 重複する行を削除する。
- 繰り返し現れる列をグループ化し、キーで連結する。
|
第2正規形 |
第1正規形で、すべての非キー属性が主キーに完全に従属している。 |
例:受注番号、商品番号、商品名、価格
f(商品番号)→商品名、価格なので、商品名、価格を分離する。
|
第3正規形 |
第2正規形で、すべての非キー属性が、 推移的に関数従属でない表 |
|
正規化しすぎると、大量で複雑なリレーションが作成されてしまう場合があります。最大でも4つ以下のテーブルの結合になるようにしたほうがよいようです。このために、
一度正規化して逆正規化を行う場合もある。
主な優れたデータベースのポイント
ポイント |
解説 |
テーブルに主キーを追加する。 |
データベースの設計理論の基本規則は、各テーブルに一意な行識別子(1 つの列または複数の列)を追加する。 |
1 つのテーブルには 1 つの型の実体を表すデータだけを格納する。 |
1
つのテーブルに格納する情報が多すぎると、テーブル内のデータ管理の効率と信頼性が低下する。適切に分割することにより、冗長性を減らし、データ量を削減す
る。 |
テーブルに NULL 値を許す列を作成しない。 |
特殊なケースでは NULL 値が便利なこともあります。しかし、NULL
値を許す列は、特殊な処理が必要でデータ操作が複雑になるため、極力使用しないようにする。 |
テーブルに繰り返し値または繰り返し列を作成しない。 |
データベース内のアイテムのテーブルには、個々の情報の値のリストを入れない。
|
ビジネスルールの適用
- どのような適用機構を利用できるか?
コード、Windows フォームや Web フォームなどのユーザー インターフェイス、データ型、制約、トリガ、ストアド
プロシージャ、イベント処理でルールを適用する。
- ルールを重複して適用する必要があるか?
場合によっては、重複してルールを適用することも必要。
- どの程度積極的にルールを適用する必要があるか?
"クレジット カードの番号は 16 桁である" ことを要求するルールは、積極的に適用する必要がある。
一方、"注文には備考が必要である" というルールは、常に適用する必要はない。
- ルールの適用によってパフォーマンスにどのような影響があるか?
GUIで入力審査するか、データベースでCHECKするかによって、パフォーマンスに影響がある。たとえば、GUIでの入力審査により、データベースとの間で情報がやり取り
をなくすことができる。
- ルールの適用によって保守性にどのような影響があるか?
特に複雑なルールの場合は、保守が簡単な方法での実装がよい。
- 実体の整合性
テーブルの識別子列または主キーの整合性を、インデックス、UNIQUE 制約、PRIMARY KEY 制約、IDENTITY
プロパティによって保証します。
- ドメインの整合性
データ型によって値の型を、CHECK 制約とルールによって値の形式を、FOREIGN KEY 制約、CHECK
制約、DEFAULT 定義、NOT NULL 定義、およびルールによって値の範囲を制限する。
- 参照整合性
レコードが入力または削除されたとき、定義されたテーブル間の関係を維持します。参照整合性によって、テーブル間でのキー値の一貫性を維持
する。
- ユーザー定義の整合性
そのほかの整合性に当てはまらない特定のビジネス ルールを定義する。
SQL Server 2000 は、5 つの制約のクラスをサポートしています。
制約 |
説明 |
NOT NULL |
列に NULL 値が受け入れられない。CREATE TABLE cust_sample
(
cust_id int PRIMARY KEY,
cust_name char(50) NOT NULL,
CONSTRAINT chk_id
CHECK (cust_id BETWEEN 0 and 10000 )
)
|
CHECK 制約 |
列に入れることができる値を制限する。CREATE TABLE cust_sample
(
cust_id int PRIMARY KEY,
CONSTRAINT chk_id
CHECK (cust_id BETWEEN 0 and 10000 )
)
|
UNIQUE 制約 |
一連の列の中にある値の一意性を設定 |
PRIMARY KEY 制約 |
その値が一意にテーブル内の行を識別する列または列セットを指定CREATE TABLE cust_sample
(
cust_id int PRIMARY KEY,
cust_name char(50) NOT NULL,
CONSTRAINT chk_id
CHECK (cust_id BETWEEN 0 and 10000 )
)
|
FOREIGN KEY 制約 |
その値が一意にテーブル内の行を識別する列または列セットを指定する。 インデックスは自動的に作成されないが、結合に多用されている場合は、インデックスを作成したほうが良い。
CREATE TABLE order_part
(
order_nmbr int,
part_nmbr int FOREIGN KEY
REFERENCES part_sample(part_nmbr)
ON DELETE NO ACTION,...
|
|
すべてのデータ値が正しく適切であることをアプリケーションに対して保証します。データ正当性チェックの種類は次のとおりです。
- データ型の正当性チェック
- 範囲のチェック
- コードのチェック
- 複合正当性チェック
用語 |
解説 |
関数従属 |
f(X,Y,Z)=A のとき、Aは、X,Y,Zの関数従属 |
完全関数従属 |
f(X,Y,Z)=A で、X, Y, Zの1つでも欠けているとAが求まらない場合 |
推移的関数従属 |
f(X) = Y; g(Y) = Z; のとき、XとZは推移的関数従属 |
参照整合性 |
参照する側のテーブルの外部キーが、参照される側のテーブルの有効な行を必ず参照していなければならないこと。 |
ドメイン |
データベースの場合、列の有効な値の範囲を指す。 |
ドメイン整合性 |
属性の値が有効な値であるかどうかを保証する。 |
|