データベース学習その4 関係データベース理論

📢 この記事は gemini-3-flash-preview によって翻訳されました

SQL シリーズ

データベース学習1 データベース導入: https://blog.yexca.net/archives/86
データベース学習2 関係モデル: https://blog.yexca.net/archives/87
データベース学習3 SQL言語: https://blog.yexca.net/archives/88
データベース学習4 関係データベース理論: この記事
データベース学習5 正規形: https://blog.yexca.net/archives/90
データベース学習6 データベース設計: https://blog.yexca.net/archives/91
データベース学習7 データベースの制御機能: https://blog.yexca.net/archives/92

関係スキーマ

関係スキーマ(リレーショナルスキーマ)は、5つの要素(5組)で構成されるものなんだ(関係名を含む)。

R<U, D, dom, F>

  1. R は関係名で、記号化されたタプルの意味を表すよ。
  2. U は属性の集合。
  3. 属性集合 U の中の属性はドメイン D から来ている。
  4. dom は属性リストからドメインへのマッピング。
  5. F は属性集合 U 上のデータ依存性(関数従属性)の集合。

3番目と4番目のポイントはスキーマ設計にはあまり関係ないから、普通は関係スキーマを3つの要素(三つ組)として扱うよ:R<U, F>。U 上のある関係 r が F を満たすとき、r を関係スキーマ R<U, F> の一つの関係と呼ぶんだ。

例えば:R を成績表、U を (学籍番号, 氏名, コース番号, 成績)、F を {学籍番号 → 氏名, コース番号 → コース名, (学籍番号, コース番号) → 成績} とする。

関数従属性

関数従属性は、最も重要で基本的なデータ依存性の一つだよ。

R(U) を属性集合 U 上の関係スキーマ、X、Y を U の部分集合とする。R(U) のどんな関係 r においても、r の中に X の属性値が等しいのに Y の属性値が異なる2つのタプルが存在し得ないとき、X は Y を関数的に決定する、または Y は X に関数従属していると言い、X → Y と書くよ。

  • 非自明な関数従属性

X → Y だが Y ⊈ X の場合、X → Y を非自明な関数従属性と呼ぶ。普通、議論するのはこの非自明な関数従属性だよ。

  • 自明な関数従属性

X → Y かつ Y ⊆ X の場合、X → Y を自明な関数従属性と呼ぶ。

  • 完全関数従属性

R(U) において X → Y であり、かつ X のいかなる真部分集合 X’ に対しても X’ が Y を決定できないとき、Y は X に完全関数従属していると言い、X -F-> Y と書く。

  • 部分関数従属性

X → Y だが、Y が X に完全関数従属していない場合、Y は X に部分関数従属していると言い、X -P-> Y と書く。

  • 推移的従属性

R(U, F) において X → Y、Y ⊈ X、Y → Z のとき、Z は X に推移的に従属していると言うよ。


参考: Untitled Document (pop0726.github.io)

キー (码)

K を R(U, F) の属性の組み合わせとする。もし K → U であり、かつ K のいかなる真部分集合 K’ に対しても K’ が U を決定できないなら、K は R の候補キー(Candidate Key)になる。候補キーが複数ある場合は、その中から1つを主キー(Primary Key)として選ぶよ。

  • 主属性と非主属性

いずれかの候補キーに含まれる属性を主属性と呼び、そうでないものを非主属性と呼ぶ。

  • 外部キー (Foreign Key)

R(U) の属性または属性集合 X が R のキーではないが、別の関係のキーである場合、X を外部キーと呼ぶ。

  • 超キー (Super Key)

すべての属性を表すことができる集合のこと。候補キーは最小の超キーなんだ。

  • 全キー (All-Key)

すべての属性が主属性である場合のこと。

関数従属性の公理系 (Armstrong の公理系)

関係スキーマ R(U, F) において、U を属性集合、F を U 上の関数従属性の集合とすると、以下の推論規則があるよ。

  1. 反射律:Y ⊆ X ⊆ U ならば、X → Y は F から導かれる。
  2. 増強律:X → Y が F から導かれ、かつ Z ⊆ U ならば、XZ → YZ は F から導かれる。
  3. 推移律:X → Y と Y → Z が F から導かれるならば、X → Z は F から導かれる。

これら3つの規則から、さらに以下の規則も導き出せるんだ。

  • 合併規則:X → Y かつ X → Z ならば、X → YZ は F から導かれる。
  • 擬推移律:X → Y かつ WY → Z が F から導かれるならば、XW → Z は F から導かれる。
  • 分解規則:X → Y かつ Z ⊆ Y ならば、X → Z は F から導かれる。

属性の閉包計算

閉包計算は候補キーを見つけるために使うよ。どうやって候補キーを選ぶかというと:

  1. 左側にしか現れない属性は、必ず候補キーに含まれる。
  2. 右側にしか現れない属性は、絶対に候補キーにはならない。
  3. 両方に現れる属性は、含まれるかもしれないし、含まれないかもしれない。
  4. どちらにも現れない属性は、必ず候補キーに含まれる。
  5. 確定した属性の閉包を求めて、すべての属性が導き出せればそれが候補キー。そうでなければ、可能性のある属性を組み合わせて閉包を求めていくよ。

例えば:

R<U, F>、U(A, B, C, D, E, G)、F = {AB → C, CD → E, E → A, A → G} の候補キーを求める。

  1. 左側にしか現れない:B, D(必ず候補キーに入る)
  2. 右側にしか現れない:G(絶対に入らない)
  3. 両方に現れる:A, C, E(わからない)
  4. 閉包を求める

BD → 何も導き出せない。だから、可能性のある属性を一つずつ足して閉包を求めてみる。
(BDA)+:C, E, A, G が導ける。よって ABCDEG すべて導き出せる。
(BDC)+:E, A, G が導ける。よって ABCDEG すべて導き出せる。
(BDE)+:A, G, C が導ける。よって ABCDEG すべて導き出せる。

というわけで、最終的な候補キーは {(BDA), (BDC), (BDE)} になるよ。

最小関数従属性集合を求める

最小依存集合(最小カバー)はどうやって求めるのかな?

1)右辺を単一属性にする(例えば A → BC を A → B と A → C に分ける)。
2)現在の従属性を除外してその属性の閉包を求め、冗長なものを消していく。
3)左辺を最小化する(属性を一つ隠しても、他の属性でその属性が導き出せるか確認する)。
例えば BCD で、B を隠して CD から B が導き出せるか、C を隠して BD から C が導き出せるか、D を隠して BC から D が導き出せるかを見るんだ。

例:
関係 R<U, F>、U{A, B, C, D, E, F, G}
F = {BCD->A, BC->E, A->F, F->G, C->D, A->G} の最小依存集合を求める。

解:

// (1) 右辺の分解と冗長性のチェック

(BCD)+ = BCDED

(BC)+ = BCD

(A)+ = AG

(F)+ = F

(C)+ = C

(A)+ = AFG (A->G は A->F と F->G から導けるので削除)

// (2) 左辺の最小化

BCD->A において C->D なので、BC->A に簡略化できる。

結果:
BC->A
BC->E
A->F
F->G
C->D

Visits Since 2025-02-28

Hugo で構築されています。 | テーマ StackJimmy によって設計されています。