このテーブルを無損失で分解できますか?


10

私は自分のリーグではないデータベース設計の問題に出くわしました。そして、私の頼りになるDBAの第一人者が消防訓練に出かけています。

本質的に、私は次の主キー(簡潔にするためにPK)を持つテーブルを持っています。

child_id   integer
parent_id  integer
date       datetime

child_idそして、parent_idエンティティテーブルへの外部キーです。「子」テーブル自体にも「親」テーブルへの外部キーが含まれています。loはそれぞれ、child_id常にparent_id上記のテーブルで想定されているものと同じものを参照します。実際、この2つを同期させるための追加のコードがあることがわかります。

これにより、この熱狂的な正規化の初心者は「代わりに冗長性を削除する必要があります!」と言います。

私は次のように分解します。

Table_1 PK:
child_id   integer
date       datetime

Table_2 PK:
parent_id  integer
date       datetime

Table_3: (already exists)
child_id   integer PRIMARY KEY
parent_id  integer FOREIGN KEY

そして、これらの人たちを自然な方法で結合すると、元のテーブルが回復します。この5NFを作ったのは私の理解です。

しかし、今ではビジネスルールが隠されていることに気づきました。

通常、特定child_idのに関連付けられている日付は、対応するに関連付けられている日付のサブセットである必要がありますparent_id。最初のテーブルがこのルールを適用していることがわかります。

日付が大きくなりすぎるまで自由に表1に追加できるため、私の分解ではルールを適用しません。

これは私をここに導き、次の質問があります:

  1. この分解は5NFですか?私はそれが挿入異常を許可すると言うだろうが、また次のそれ自体、Wikiの例に従うように見えるこのガイドを。「私が強調したもの」というフレーズは、「3つの別個のレコードタイプからなる正規化された形式からすべての真の事実を再構築できる」という特別な休止を与えますTable_1

  2. この分解が気に入らないとしましょう(気に入らない)。テーブルとコードをそのままにしておくことが実際的な解決策であることを私は自由に認めます。しかし、理論的には、最初のテーブルから離れてビジネスルール保持するように制約を分解または追加する方法はありますか?


1
元のテーブルのキーは何ですか?どのような依存関係が満たされるはずですか?child_id-> parent_idと言っているようですが、その場合、child_idとparent_idの両方をそのテーブルの同じキーの一部にすることはできません。
nvogel

1
@trevor:ここで答えを確認したことはありますか?最後に尋ねた19分後に見た。答えは後で来ました。
gbn 2011

回答:


9

正規化は、機能の依存関係に基づいています。機能の依存関係はセマンティクスと関係があります。彼らはデータの意味と関係があります。実際の問題を「parent_id、child_id、date」のレベルに簡略化し、サンプルデータを含めない場合、良心的なデータベース設計者が提供できる支援の量が本当に制限されます。

1つのテーブルにキー{child_id、parent_id、date}があり、子テーブルに一意のペア{child_id、parent_id}がある(と思われる)ことは、組み合わせの一部が必ずしも冗長であるとは限らない。{child_id、parent_id、date}を主キーとするテーブルでは、最初に属性のペア{child_id、parent_id}が子テーブルを参照する必要があることを意味する場合があります。

その場合は、を使用できますFOREIGN KEY (child_id, parent_id) REFERENCES child (child_id, parent_id)。これを行うには、テーブル "child"の列のペア(child_id、parent_id)にUNIQUE制約が必要です。これは、child_idが主キーである場合は問題になりません。

しかし、データが何を意味するのかを知らずに判断する方法はありません。あなたはこのスレッドでそれを知っている唯一の人です。(ただし、説明させていただきます。)

元のテーブルに関する限り、そのchild_id-> parent_idと言っているようです。その場合、元のテーブルのparent_idがそもそもなぜですか。キーが(child_id、date)だけではなく、 "child"テーブルへの外部キー参照があるのはなぜですか?あなたが話している冗長性の種類は、列「parent_id」を削除することで解決できるようです。

SQL DDLとINSERTステートメント形式のサンプルデータは、私たちを支援します。DDLおよびINSERTステートメントは、説明よりも正確です。


1
+2「機能依存関係」のリマインダー
jcolebrand

3

これを試して...

  • 一意の制約を(child_id,parent_id)子テーブルに追加します
  • 現在のテーブル(PK,FK:child_id, PK,FK:parent_id, PK:date)はそのままで、FKは新しい一意制約の2列にあります

または

  • 現在の子テーブルからFKを削除します
  • (PK,FK:child_id, FK:parent_id)子で1:1の新しいテーブルを作成する
  • 現在のテーブル(PK,FK: child_id, PK,FK: parent_id, PK:date)はそのままです。しかし、FKは新しいテーブルの2列にあります

他に何もなければ、それはあなたを刺激するかもしれません...

私が正しく理解していれば、冗長性とコードが削除されます...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.