ここに故障があります:
* 直接依存関係: テーブルは、他のテーブルの主キーを参照する外部キーを含む場合、別のテーブルに直接依存します。たとえば、「注文」テーブルには、「顧客」テーブルを参照する外部キーがある場合があります。
* 推移的依存関係: テーブルが3番目のテーブルに依存する別のテーブルに依存する場合、それは推移的依存関係と呼ばれます。 「注文」テーブルに「顧客」テーブルを参照する外部キーがあり、「顧客」テーブルには「地域」テーブルを参照する外部キーがあるシナリオを想像してください。この場合、「注文」テーブルは、「領域」テーブルに推移的な依存性を持っています。
推移的依存性の結果:
* データ冗長性: 3番目のテーブル(領域情報など)に関連するデータは、2番目の表の複数のレコードで複製されます。
* アノマリーを更新: 3番目のテーブルの変更には、2番目のテーブルと最初のテーブルの両方で更新が必要で、矛盾のリスクが高まります。
* 挿入異常: 2番目と3番目のテーブルの両方に対応するレコードがない限り、最初のテーブルにレコードを挿入することはできません。
* 削除異常: 3番目のテーブルでレコードを削除すると、1番目と2番目のテーブルで矛盾と潜在的なデータ損失を引き起こす可能性があります。
* パフォーマンスの問題: 推移的依存関係を含むクエリは、複雑で非効率的です。
正規化と推移的依存関係:
データベースの正規化の目標は、推移的依存関係を削除することにより、これらの問題を排除することです。これは通常、元のテーブルを推移的な依存関係で2つのテーブルに分割することによって達成されます。1つは3番目のテーブルに直接関連し、もう1つは最初のテーブルと直接関係しています。
例:
上記のテーブルの簡単な例を考えてみましょう。
* 注文: (OrderId、customerid、orderdate、...)
* 顧客: (CustomerID、CustomerName、RegionID、...)
* 領域: (RegionID、RegionName、...)
ここで、「注文」は、「顧客」を通じて「地域」に推移的な依存性を持っています。正規化するには、新しいテーブルを作成できます。
* カスタマーリージョン: (CustomerID、RegionID)
この新しいテーブルは、推移的依存性を排除します。 「注文」は「顧客」に直接依存し、「顧客」は「顧客」に直接依存し、「地域」に依存します。
要約:
データベース設計では、推移的依存関係は望ましくありません。それらは、データの冗長性、異常の更新、および潜在的なパフォーマンスの問題につながります。 これらの依存関係を排除し、データの整合性と効率を確保するために、データベースの正規化手法が採用されています。
