インデックス
インデックスは、テーブルのデータを高速に処理するための仕組みのこと。
列に索引を付けることで、並べ替えや検索の速度が大幅に向上する。
また、インデックスを固有に設定することで、値が重複しないようにすることもできる。
ただし、インデックスを作成しすぎるとかえって処理が遅くなることもある。
主キー・外部キー
主キーは、テーブルから特定の行を識別するための列のこと。
主キーを設定することで、行を効率的に管理できるようになる。
主キーには、次の制約があるよ。
- 一意性制約:他の値と重複しない
- NOT NULL制約:空の値(NULL)がない
外部キーは、他の表の主キーを参照する列のこと。次の制約があるよ。
- 参照制約:外部キーの値が被参照表に存在する
連結主キーは、複数の列を組み合わせて設定する主キーのこと。
メモ型、OLEオブジェクト型、添付ファイル型の列を主キーに設定することはできない。
正規化
正規化は、テーブルをできるだけ単純にして、管理しやすくすること。次のようなメリットがある。
- 繰り返し部分がなくなるため、データベースのサイズが小さくなる。
- テーブルを分割するため、各テーブルの目的が分かりやすくなる。
- データの更新などがしやすくなる。
第1正規化
正規化では、まず繰り返し部分を排除する第1正規化という作業を行う。例えば、次のような表があるとする。
在庫・商品表
| 在庫番号 | 倉庫番号 | 倉庫名 | 商品番号 | 商品名 | 単価 |
|---|---|---|---|---|---|
| 0000001 | 000000A | 東京倉庫 | F01 | マグロ | 600 |
| F02 | トロ | 800 | |||
| F03 | サーモン | 500 | |||
| 0000002 | 000000B | 大阪倉庫 | F02 | トロ | 800 |
| F03 | サーモン | 500 | |||
| 0000003 | 000000C | 京都倉庫 | F01 | マグロ | 600 |
| F03 | サーモン | 500 |
この場合、グレーの部分が繰り返し部分になる。
繰り返し部分をなくすため、在庫・商品表を在庫表と商品表に分割する。
その際、在庫番号を主キー、繰り返し部分を一意に定めることができる商品番号を連結主キーにする。
在庫表
| 在庫番号 | 倉庫番号 | 倉庫名 |
|---|---|---|
| 0000001 | 000000A | 東京倉庫 |
| 0000002 | 000000B | 大阪倉庫 |
| 0000003 | 000000C | 京都倉庫 |
商品表
| 在庫番号 | 商品番号 | 商品名 | 数量 |
|---|---|---|---|
| 0000001 | F01 | マグロ | 500 |
| 0000001 | F02 | トロ | 800 |
| 0000001 | F03 | サーモン | 500 |
| 0000002 | F02 | トロ | 800 |
| 0000002 | F03 | サーモン | 500 |
| 0000003 | F01 | マグロ | 600 |
| 0000003 | F03 | サーモン | 500 |
第2正規化
第1正規化をしたら、次に第2正規化という作業を行う。
第2正規化では、主キーによって決まる部分を、複数のテーブルに分割する。
例えば、先ほどの商品表は、商品番号によって商品名が決まる。
商品表
| 在庫番号 | 商品番号 | 商品名 | 数量 |
|---|---|---|---|
| 0000001 | F01 | マグロ | 500 |
| 0000001 | F02 | トロ | 800 |
| 0000001 | F03 | サーモン | 500 |
| 0000002 | F02 | トロ | 800 |
| 0000002 | F03 | サーモン | 500 |
| 0000003 | F01 | マグロ | 600 |
| 0000003 | F03 | サーモン | 500 |
これをなくすため、商品表を商品表1と商品表2に分解する。
この時、商品番号は商品表1の主キー、商品表2の外部キーにする。
商品表1
| 商品番号 | 商品名 |
|---|---|
| F01 | マグロ |
| F02 | トロ |
| F03 | サーモン |
商品表2
| 在庫番号 | 商品番号 | 数量 |
|---|---|---|
| 0000001 | F01 | 500 |
| 0000001 | F02 | 800 |
| 0000001 | F03 | 500 |
| 0000002 | F02 | 800 |
| 0000002 | F03 | 500 |
| 0000003 | F01 | 600 |
| 0000003 | F03 | 500 |
第3正規化
第2正規化をしたら、次に第3正規化という作業を行う。
第3正規化では、主キー以外によって決まる部分を、複数のテーブルに分割する。
例えば、先ほどの在庫表は、在庫番号によって倉庫番号が決まり、倉庫番号によって倉庫名が決まる。
在庫表
| 在庫番号 | 倉庫番号 | 倉庫名 |
|---|---|---|
| 0000001 | 000000A | 東京倉庫 |
| 0000002 | 000000B | 大阪倉庫 |
| 0000003 | 000000C | 京都倉庫 |
これをなくすため、在庫表を在庫表1と在庫表2に分解する。
この時、倉庫番号は在庫表1の主キー、在庫表2の外部キーにする。
在庫表1
| 在庫番号 | 倉庫番号 |
|---|---|
| 0000001 | 000000A |
| 0000002 | 000000B |
| 0000003 | 000000C |
在庫表2
| 倉庫番号 | 倉庫名 |
|---|---|
| 000000A | 東京倉庫 |
| 000000B | 大阪倉庫 |
| 000000C | 京都倉庫 |
リレーションシップ
リレーションシップは、複数のテーブルで共通する値を関連付けるもの。次のような種類がある。

テーブル①とテーブル②を、1対1で関連付ける。

テーブル①とテーブル②を、1対多で関連付ける。

テーブル①とテーブル②を、多対多で関連付ける。
テーブルの結合
テーブルの結合は、複数のテーブルを1つのテーブルにすること。
リレーションシップを設定することで、次のような結合を行うことができる。
| 大分類 | 小分類 | 詳細 |
|---|---|---|
| 内部結合 | – | 右側のテーブルと左側のテーブルで、共通するレコードを表示する。 |
| 外部結合 | 左外部結合 | 左側のテーブルを基準にして結合する。左側のテーブルにある全てのレコードと、右側のテーブルにある一致したレコードを表示する。 |
| 右外部結合 | 右側のテーブルを基準にして結合する。右側のテーブルにある全てのレコードと、左側のテーブルにある一致したレコードを表示する。 |
参照整合性
参照整合性は、テーブルを結合した際に、値の整合性を維持する仕組みのこと。
参照整合性を設定するには、フィールドが次の条件を満たす必要がある。
- 関連付ける2つのテーブルが、同じデータベースにあること。
- 関連付ける2つのフィールドのうち、1つが主キーであること。
- 同じデータ型であること。
- 数値型のフィールドの場合、同じサイズであること。
参照整合性を設定することで、次のルールが適用される。
- テーブル①にない値を、テーブル②に入力できない。
- テーブル①のレコードを削除する時、テーブル②に関連付けられたレコードがある場合、削除することができない。
- テーブル①の主キーの値を変更する時、テーブル②に関連付けられたレコードがある場合、変更することができない。
参照整合性を設定すると、これらのルールが適用されて、整合性が保たれるようになる。しかし、これらのルールがあることで、変更や削除ができないことがあり不便になる。
そのため、連鎖更新や連鎖削除を使用して、ルールを緩和することもある。
連鎖更新は、テーブル①の主キーのフィールドの更新を許可するもの。テーブル①の主キーのフィールドを更新した場合、テーブル②の主キーのフィールドも更新される。
連鎖削除は、テーブル①のレコードの削除を許可するもの。テーブル①のレコードを削除した場合、テーブル②のレコードも削除される。