テーブル設計をする際に気をつけたいこと
テーブル設計を試みた際に、テーブルの構造をどうすれば良いのか不明確だったため、調べつつ4つのルールにまとめてみた。
テーブル設計のルール
ルール1
テーブルはある共通の属性を持ったモノの集合であること
表1はテーブルとはいえない。表2はテーブルといえる
表1 共通の属性を持たない
列1 | 列2 | 列3 | 列4 |
---|---|---|---|
食べ物 | 刺し身 | 焼き肉 | そば |
佐藤さん | 田中さん | 福田さん | 塩田さん |
ボーナス | ゲーム | 旅行 | 温泉 |
表2 共通の属性を持つ
原子番号 | 元素記号 | 元素名 |
---|---|---|
1 | H | 水素 |
2 | He | ヘリウム |
3 | Li | リチウム |
ルール2
レコードを1行に特定できる主キーが存在すること
表3は同性同名・同年齢・同じ性別の人の区別がつかない。表4は主キーにより特定することが可能
表3 主キーが存在しない
名前 | 年齢 | 性別 |
---|---|---|
鈴木一郎 | 25 | 男 |
鈴木一郎 | 25 | 男 |
田中修 | 30 | 男 |
表4 主キー(社員ID)が存在する
社員ID | 名前 | 年齢 | 性別 |
---|---|---|---|
001 | 鈴木一郎 | 25 | 男 |
002 | 鈴木一郎 | 25 | 男 |
003 | 田中修 | 30 | 男 |
ルール3
1つのセルに複数の値が存在してはいけない
表5は1つのセルに複数の値が存在している。表5を表6と表7に分割することで、セルの値を1つにできる
表5 1つのセルに複数の値が存在している
社員ID | 名前 | 年齢 | 性別 | 兄弟 |
---|---|---|---|---|
001 | 鈴木一郎 | 25 | 男 | 次郎 |
002 | 鈴木一郎 | 25 | 男 | 悦子 |
003 | 田中修 | 30 | 男 | 聡, 小春 |
表6 社員
社員ID | 名前 | 年齢 | 性別 |
---|---|---|---|
001 | 鈴木一郎 | 25 | 男 |
002 | 鈴木一郎 | 25 | 男 |
003 | 田中修 | 30 | 男 |
表7 社員・兄弟
社員ID | 兄弟番号 | 兄弟の名前 |
---|---|---|
001 | 1 | 次郎 |
002 | 1 | 悦子 |
003 | 1 | 聡 |
003 | 2 | 小春 |
ルール4 「推移関数従属」が存在しないこと
「推移関数従属」とは、主キーから見て2段階の関数従属が存在しているもの。
表8は「推移関数従属」が存在しており、新しく業界名を追加しようとしてもできない。表8を表9と表10に分割することで、「推移関数従属」を無くすことができる。
表8 2段階の関数(推移関数従属)が存在している
企業ID | 企業名 | 業界コード | 業界名 |
---|---|---|---|
001 | A商社 | 001 | 不動産 |
002 | B株式会社 | 002 | 電力 |
003 | C研究所 | 003 | 医療 |
表9 企業テーブル(推移関数従属が存在しない)
企業ID | 企業名 | 業界コード |
---|---|---|
001 | A商社 | 001 |
002 | B株式会社 | 002 |
003 | C研究所 | 003 |
004 | Dテクノロジー | 004 |
表10 業界テーブル(推移関数従属が存在しない)
業界コード | 業界名 |
---|---|
001 | 不動産 |
002 | 電力 |
003 | 医療 |
004 | IT |
まとめ
テーブル設計をする際に気をつけるポイントがわかった。特に推移的関数従属が存在するかどうか見極め、正しくテーブルを分解したい。
参考
おうちで学べるデータベースのきほん ミック (著), 木村 明治 (著)