□技術メモ - DB設計 ※管理人の個人的な技術メモです。このページの内容の実行結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ----------------------------------------------------------- ■データベースの正規化 ○正規化1 繰り返しの排除 key:注文情報|商品1|商品2|商品3|... → key:注文情報|key:商品コード1|商品1情報 key:注文情報|key:商品コード2|商品2情報 key:注文情報|key:商品コード3|商品3情報 ... ○正規化2 主キーに完全従属する項目の分離 ・主キーによって確定する項目は別テーブルへ移す。 key:注文情報|key:商品CD|商品名|単価|商品情報 → 商品名より右の項目は商品CDが分かれば確定するので別テーブルへ移す。 ○正規化3 主キー以外に完全従属する項目の分離 key:注文番号|顧客CD|会社名|住所|代表者名|連絡先 → 会社名より右の項目は顧客CDが分かれば確定するので別テーブルへ移す。 ○ボイス・コッド正規化 (Boyce/Codd normal form ; BCNF) ・非キーからキーへの従属性があるときはこれを除く key:学生|key:科目|講師 ・この場合以下の関係がある。 (学生,科目)→講師が決まる。 (講師)→科目が決まる。 ・非キーからキーへの従属性を除くと以下の関係になる。 学生→履修する→講義番号 講師→担当する→講義番号 ・従ってテーブルは以下の2つに分離される。 key:学生|講義番号 key:講義番号|講師|科目 ○正規化4 多値従属性の排除 ・以下の例では冗長性がある。これは以下の2つのテーブルに分離できる。 科目|教材 |講師 ------------------- 国語|text1|鈴木 国語|text2|鈴木 国語|text1|佐藤 国語|text2|佐藤 国語|text1|山田 国語|text2|山田 → 科目|教材 ---------- 国語|text1 国語|text2 科目|講師 ------------------- 国語|鈴木 国語|佐藤 国語|山田 ○正規化5 射影−結合正規化 ・稀に正規化5が必要な場合がある。 ・例として(ドクター、担当する病気、保険会社)の関係を書き出す。 Dr. |部位|保険会社 ---------------------- 佐藤|肺 |A 佐藤|肺 |B 鈴木|胃 |A 鈴木|胃 |C 田中|大腸|B 田中|大腸|C 田中|胃 |A 田中|胃 |C →3つのテーブルに分離できる Dr. |部位 ----------- 佐藤|肺 鈴木|胃 田中|大腸 田中|胃 Dr. |保険会社 ----------- 佐藤|A 佐藤|B 鈴木|A 鈴木|C 田中|A 田中|B 田中|A 保険会社|部位 --------------- A |肺 A |胃 B |肺 B |大腸 C |肺 C |胃 C |大腸 ※注意 完全に正規化をしたRDBMS(関係データベース管理システム)はクエリのパフォーマンスがよくないことがある。 その場合はパフォーマンスを優先して非正規化をすることもあることに注意。 -----------------------------------------------------------