🪟

【図解+動画】スーパーキー・候補キーの特定・主キーの選択

に公開

はじめに

この記事は 「【図解+動画】テーブル正規化の目的 + 非正規形 → 第1正規形」 の続きとして書いています。
https://zenn.dev/baayan/articles/41e83d1c7a1c73

第1正規化の知識がある前提の記事になりますので、もしまだ第1正規化がわからないという方がいらっしゃれば上記の記事を読んでから本記事を読んでみてください!

スーパーキーとは

スーパーキーは 「スーパーキーの列の値が決まれば行が特定できるもの」 です。

以下の表でスーパーキーを考えます。

※この表は 「受注番号」「商品コード」 が決まれば行を特定できるとします。

スーパーキーはその行が特定できればOKなので、たくさんの組み合わせがあります。
全ての列の組み合わせもスーパーキーになりますし、 「受注番号」「商品コード」 だけもスーパーキーになります。

逆に 「受注番号」「商品コード」 を含まない組み合わせでは、行を一意に特定できないのでスーパーキーになりません。

候補キーとは

候補キーは「スーパーキーのなかでこれ以上列を削れないもの」になります。
前述のスーパーキーの例で考えると「受注番号」と「商品コード」が候補キーになります。

候補キーは複数存在する場合もある

「受注番号」「商品コード」 だけじゃなく 「受注番号」「商品名」 でも行を特定できるとすると 「受注番号」「商品名」 も候補キーになります

候補キーは列数が異なる場合もある

上記では列の数が2つのものが候補キーになっていますが、候補キーの列数が異なる場合もあります。
行を一意に特定できる 「行ID」 を追加した場合、 「行ID」 も候補キーになります。

非キー属性とは

どの候補キーにも含まれない列を非キー属性といいます。
前述の表で具体的に非キー属性を考えると 「行ID」「受注番号」「商品コード」「商品名」 以外が非キー属性になります。

動画:【テーブルの正規化】スーパーキー・候補キー・非キー属性

https://x.com/baayan_public/status/1971827193975394604

候補キーの特定

以下の表の候補キーを特定していきます。

今回この表には以下のような依存関係があるとします。

  • 受注番号 が決まると 顧客コード, 顧客名, 受注日が決まる。
  • 商品名 が決まると 商品コード がきまる
  • 商品コード が決まると 商品名 が決まる。
  • 商品名 が決まると 単価 が決まる。
  • 受注番号商品コード が決まると 受注数 が決まる。

この関係性を図に表していきます。

  • 受注番号 が決まると 顧客コード, 顧客名, 受注日が決まる。

  • 商品名 が決まると 商品コード がきまる
  • 商品コード が決まると 商品名 が決まる。

  • 商品名 が決まると 単価 が決まる。

  • 受注番号商品コード が決まると 受注数 が決まる。

「受注番号+商品コード」 or 「受注番号+商品名」 で行の値が一意に定まることがわかります

これが 候補キー になります。

主キーの選択

候補キー の中から 主キー を設定します。
主キーは候補キーの条件に追加して NULL(値なし)が許容されない 制約がつきます。
(実際のDBMSでは実装によりNULLが許容される場合もあります)

動画:【テーブルの正規化】候補キーの特定・主キーの選択

https://x.com/baayan_public/status/1969650255454220315

この記事の続き

候補キー・非キー属性に続き第2正規化の理解に必要な関数従属についてかいています。

https://zenn.dev/baayan/articles/49a94072c61fa2

Discussion