関係データベースの勉強をしていたら、主キーとか外部キーとか色んなキーが出てきたよ?
違いがよくわからないな〜
データベースの各種キーの違いが複雑で、困っていませんか?
本記事をご覧いただくことで、次のことがわかります。
✅関係スキーマにおける記述方法がわかる
✅データベーススペシャリスト試験で気をつけるべきポイントもわかる
主キーや外部キー、候補キーやスーパーキー、代理キーといった、関係データベースのキーの違いや制約について、わかりやすく解説しました。
キーの話の前に、関連データベースについて復習したい方は、ぜひこちらの記事を御覧ください。
- TechAcademy [テックアカデミー]
豊富なコースで目的にあわせて選択可能、初心者から転職希望者までタイプ別にプランをカスタマイズ。マンツーマンのサポートがつく。 - DMM WEBCAMP
転職成功率98%&離職率2.3%。転職できなければ全額返金。DMM.comグループならではの非公開求人も多数 - アイデミー
AIやデータサイエンスに特化。オンライン学習なのでいつでも学習可能。学習したい講座を自由に追加受講することができる。
関係スキーマ
関係スキーマとは
関係スキーマとは、関係データモデル(関係表・リレーションデータモデル)の骨格を指します。
スキーマとは、骨格という意味です。
関係スキーマを作る過程で、「表を用意し、どのようなデータを入れるべきか」を考えていきます。
関係スキーマの書き方
関係スキーマの書き方は、次の形式に決まっています。
データベーススペシャリスト試験での注意点
データベーススペシャリスト試験では、下記のルールに従って関係スキーマを記載する必要があります。
2. ()の中に属性名を書く
3. 複数の属性を記載する場合は「,」で区切る
ルールに従っていない記述は、0点になってしまうので注意しましょう。
関係データベースで使われるキー
キーは、関係データベースで大事な要素です。
関係スキーマを記載する時には、どの属性がキーになるかを見定める必要があります。
主キー(primary key)
主キーとは、データベースのデータ(レコード)を一意に識別するための項目です。
主キーはわかりやすいように、属性名の下に実線を引きます。
主キーは、次で紹介する候補キーの中から選ばれたキーになります。
候補キーの説明とともに、もう少し主キーについて理解を深めましょう
候補キー(candidate key)
候補キーとは、主キーの候補になるキーのことです。
候補キーから主キーを決めるんだね!
候補キーは、次の2つの性質を持ちます。
・必要最小限の属性の集合:極小性
「一意」とは、「唯一」という意味です。「これだ」と一つだけ指定できる状態のことだよ。
商品No | 商品名 | 単価 |
---|---|---|
S1 | おにぎり | 100 |
S2 | おにぎり | 150 |
この商品表の候補キーとしては、「商品No」がありますね。
「単価」でも、行の特定はできそうですが、適切とは言えないですね…
例えば、商品検索する時に、いちいち単価で確認するのは面倒です。
スーパーキーとは
タプル(行)を一意に指定できればいいのなら、「商品No+単価」の組み合わせなども候補キーになりそうですね。
例えば「商品Noと単価」を組み合わせても、指定できるから候補キー?
違うよ!
ここで登場するのが、候補キーのもう一つの性質である「極小性」です。
極小性により、必要最小限の属性数でないといけません。
今回の例でいうと、商品Noの1属性のみで候補キーの役割を果たせるため、2属性を指定しなければならない「商品Noと単価の組み合わせ」は候補キーにはなりません。
このような場合、商品Noと単価の組み合わせはスーパーキーになります。
候補キーに余計な属性を付け加えたものは候補キーではありませんが、スーパーキーに該当します。
スーパーキーや候補キーなど属性の組み合わせは、波括弧で表現するルールになっています。
候補キーから主キーを選ぶ方法
候補キーのうち、どれを主キーに選んだらよいでしょうか?
どの候補キーを選んでも良いというわけではなく、業務内容によって適切なものを選択する必要があります。
実際、どうやって選んだらいいのかな?
主キーのルール(主キー制約)を考慮することがポイントだよ
主キー制約
主キー制約は、次の2つです。
- 一意性制約:同値はとれない
- 非NULL値制約:空(NULL値)はNG
候補キーの「一意性」の性質があるため、1の一意性制約は全候補キーが満たせることになります。
一方、2の非NULL制約が満たせるかに関しては、各候補キーがNULLになるかどうかを検討する必要があります。
属性の候補キーをNULLにしてもOKとするかどうかは、業務内容によります。
例えば、「商品Noは入荷した段階で決定されるが、単価は未確定状態である企業」の場合は、
単価はNULLになる可能性がありますね。
よって、商品Noが主キーにふさわしいと言えます。
まとめ
主キー・候補キー・スーパーキーの関係をまとめます。
主キーは次の手順で求めます。
複合キー
複数の属性を組み合わせて構成された主キーを複合キーと呼びます。
例えば、次の表では、商品Noと購入者IDを組み合わせることで一意に定められます。
つまり、主キーは複合キー{商品No,購入者ID}となります。
商品No | 商品名 | 単価 | 購入者ID | 購入者氏名 |
---|---|---|---|---|
S1 | おにぎり(鮭) | 100 | U001 | いぬ太郎 |
S1 | おにぎり(鮭) | 150 | U100 | ねこ子 |
S2 | おにぎり(梅) | 100 | U150 | かえる次郎 |
S3 | サンドイッチ | 200 | U001 | いぬ太郎 |
複合キーの片割れを主キーと呼ぶのはNGだよ!
今回の場合、例えば、商品Noのみを主キーと呼ぶのは間違いです。
ありがちな間違いなので、注意しましょう。
商品Noは主キーの一部に過ぎないんだね。
商品Noと購入者ID、2つ合わせて主キーと同じ役割なんだね。
外部キー(foreign key)
他の表を参照することで、他の情報を得ることができます。
他の表の行を参照するためのキーを、外部キーといいます。
複数の表があると、表を参照することで新しい情報がわかるんだね!
上記の表の場合は、購買テーブルと購入者テーブルを結びつける「購入者ID」が外部キーです。
外部キーの場合は、属性の下に破線を書きます。
ただし、主キーであり、かつ、外部キーである場合は、破線は不要です。
データベーススペシャリストの試験問題の中には、主キーかつ外部キーであっても破線を書くように指定される場合があるよ。
その場合は、破線を引かないと0点になるので、注意が必要です。
参照制約
外部キーのルール(制約)としては、参照制約があります。
参照制約とは、参照先に値が存在することを保証することです。
どういうこと?
ブログやウェブサイトをイメージすると、わかりやすいです。
例えば、あるブログに貼ってあるリンクを押しても、遷移先のウェブページが存在しなかったという経験はありませんか?
このように参照先に値が存在しないとユーザ的に不便なので、参照元と参照先とで整合性が取れるようにルールを決めます。
このルールが、参照制約です。
リンク切れを防ぐイメージだね
参照制約には、2種類あります。
- 追加:参照先に存在しない値は、参照元に追加できない
- 削除:参照元に存在する値(参照されている値)は、参照先から削除できない
- 対応1:RISTRICT「一切の削除を禁止する」
- 対応2:CASCADE「参照元から削除する」
- 対応3:SET NULL「NULL値を設定する」
対応3のSET NULLは、主キーの非NULL値制約より、主キーでもある外部キーの場合には適用できません。
どの対応方法を選ぶかは業務に寄りますが、対応2のCASCADEが一般的です。
代理キー(alternate key)
代理キー(alternate key)とは、主キーに選ばれなかった候補キーのことです。
代替キー(surrogate key)
代替キー(surrogate key)とは、後から候補キー(主キー)として利用できるように追加した属性のことです。
例えば、通し番号や行番号だよ
通し番号があれば、候補キーとして使えるね
商品表
通し番号 | 商品No | 商品名 | 単価 |
---|---|---|---|
1 | A001 | おにぎり | 100 |
2 | A003 | サンドイッチ | 200 |
3 | B002 | ジュース | 120 |
4 | B004 | ゼリー | 200 |
商品を探す場合、商品Noで検索はできますが、「上から何番目(通し番号が〇〇)」で答えたほうが楽です。
主キーが、複雑で面倒な時に代替キーが役立ちます。
主キー全ての要素に、必ずしも値が入るわけではない場合も代替キーが便利です。
まとめ
主キーや外部キーなどの違いについて、ご説明しました。
データベースについて、より詳しくなりたい方は、データベーススペシャリストの試験もぜひ受けてみてください。
データサイエンスを本気で学ぶなら、スクールがおすすめ!
おすすめスクールは、こちらからCHECK