【5分で解説】データーベースの主キー、関数従属、正規化を解説!
こんにちは!駆け出しエンジニアのガッキー(@ExplorerZine)です。
突然、会社でER図設計をやることになりました。
しかしデーターベース設計は経験がなく、基礎知識もない!汗
急いで書籍で学習してインプットしました!
そこで、今回はデーターベースの基礎知識である、
主キー、関数従属、正規化を非常に簡潔に分かりやすく解説してみたいと思います。
主キーとは?
主キーとは、テーブルの各レコードを特定することが出来る列のことです。
例を見てみましょう!
商品ID (A) | 商品名 (B) | 単価 (C) |
---|---|---|
1 | りんご | 100 |
2 | みかん | 80 |
3 | いちご | 120 |
4 | ばなな | 100 |
こちらの表では商品IDが主キーとなっています。商品IDを指定すれば、どの商品、単価が分かります。
これが単価を主キーにしても、りんご、ばななが同じ単価で100円の単価の商品が2つあり、
どのレコードか判別することが出来ません。
主キーは一意・ユニークである必要があります。(カラムのなかの値が重複しない。)
設定するデータ型は数値型が一般的で文字列を設定するケースは少ないです。
例えば名前を主キーとして「山田太郎」と「山田 太郎」という値が入ってきた場合、
レコードの特定が複雑になってしまいますね。
関数従属とは?
関数従属とはあるAが分かればBも分かる関係を指します。
具体的に表を見てみると
商品ID (A) | 商品名 (B) | 単価 (C) |
---|---|---|
1 | りんご | 100 |
2 | みかん | 80 |
3 | みかん | 110 |
4 | なし | 100 |
商品IDが分かれば、商品名が分かります。
商品名が決まっても単価は特定されません。仮にみかんという商品は80、110円2つの金額があります。
- A → B (商品ID → 商品名) に関して関数従属が成り立つ。
- B → C (商品名 → 単価) に関して関数従属が成り立たない。
- A → C (商品ID → 単価) に関しては関数従属が成り立つ。
部分関数従属
部分関数従属とは一部の列にだけ従属する列がある関係のことを指します。
具体的なテーブルを見ていきましょう。
学科ID | 学科名 | 学生コード | 氏名 | 出身地 |
---|---|---|---|---|
1 | A学科 | 101 | たろう | 東京 |
1 | A学科 | 102 | ゆうこ | 大阪 |
2 | B学科 | 103 | けんた | 愛知 |
2 | B学科 | 104 | くみこ | 静岡 |
こちらの図では主キーが学科ID、学生コードになるのですが、
- 学科名は学科IDに部分関数従属
- 氏名、出身地は学生コードに部分関数従属
このようなテーブルになっています。
正規化(第2正規形)
さて、先ほどのテーブルには1つ問題があります。
それは仮に新しくC学科を作ろうにも所属する学生が存在しないのです。
主キーの学生コードにはnullを入れることは出来ないのでレコードを登録することが出来ません。
この場合、テーブルを分割して整頓してあげる「正規化」をしてあげる必要があります。
学科ID | 学生コード | 氏名 | 出身地 |
---|---|---|---|
1 | 101 | Taro | Tokyo |
1 | 102 | Yuko | Osaka |
2 | 103 | Ken | Aichi |
2 | 104 | Kumi | Shizuoka |
学科ID | 学科名 |
---|---|
1 | A学科 |
2 | B学科 |
このようにテーブルを分割してあげることで仮に学科テーブルにC学科が新設されても問題はありません。
データーベース設計に役立つ書籍
会社でデーターベース設計をするにあたり、
知識ゼロだった僕はこちらの「達人に学ぶDB設計 徹底指南書」で一気にインプットしました。
こちらの書籍はデーターベース初学者にとっても非常に分かりやすく、
データーベース構築の考え方から、先ほどの「正規化」、そして「ER図」についても網羅されており、
短期間で知識を補う必要があった自分にとっても非常に役立つ本でした。
自分のような駆け出しエンジニア・1~3年目エンジニアの方にとってもオススメです!
まとめ
いかがでしたか?
始めてデーターベース設計をやってみた僕は非常に戸惑うことが多く、
先輩からも沢山指摘を受けることがありました。
ただ始めは小さなテーブルの集まりだったER図が大きくなって立派なER図が完成した時は
とっても達成感があって嬉しかったのを覚えています。
是非今後とも一緒に学んでいきましょう!!