2017-05-18 10 views
0

次に示すのは、私が直面している問題を実証している実例のスキーマの図です。私は確認してないか、SQLでそのドア(ハウスやドアの青写真)各両方持っている同じ家の青写真の親に親レコード:2つの親レコードがSQLで同じ祖父母レコードを持つようにする方法

My schema

私の質問はありますか?言い換えれば、どのようにすべてのドアレコードにハウスブループリントの祖父母が1つしかないことを確認するにはどうすればよいですか?

私は既に、外部キーが1対多の関係を指定するためのベストプラクティスを使用しています。私はドアのテーブルが必要です。ドアのインスタンスは、家に基づいて任意の色を塗装することができます。 Door Blueprintテーブルが必要です。誰がドアを設計したのかを追跡したいからです。また、この設計された例では、Door Blueprintは1つの親House Blueprintしか持てません(これは現実的ではないので、Door Blueprintを複数のHouse Blueprintで使用できる可能性は無視してください)。

私が遭遇している問題は、時々、あるHouse Blueprintと別のHouse Blueprintレコードに添付されたDoor BlueprintにHouseレコードを添付してDoorレコードを取得することです。これは決して起こらないはずです。そして私はおそらく私のレコード挿入ロジックでこれを防ぐことができますが、それはSQLレベルではありません。

私はDoorからHouse Blueprintに戻って2つの異なる道があるのは不安ですが、それ以外の方法はありません。

私は自分自身で構文を理解することができるので、コードスニペットを探しているわけではありません。むしろ、私はの問題を解決するための高度なアプローチを探しています。また、私はSQLite3を使用していますが、この問題はどのRDBMSでも解決できると思います。

ありがとうございました!

+0

上位レベルのアプローチは、すべての関数の依存関係を*すべて*列挙し、ハサミで実行したい場合は5NFまたはBCNFに正規化することです。 –

答えて

1

リレーショナルデータベースでは、アサーションを使用します。 SQLデータベースでは、重複する外部キー参照を一意の制約に使用します。 (候補キーへの外部キー参照ではありません)。最小限ではないため、ユニーク制約は候補キーではありません。しかし、重複する外部キーのターゲットを提供する必要があります。

テーブル「doors」には、house_blueprint_idの1つの列と、それを使用する2つの重複する外部キー制約があります。これらの外部キー制約は、house_blueprint_idに異なる値を持つことはできません。

+0

私のテーブルIDがすべて自動的にインクリメントされていると仮定すると、住宅やdoor_blueprintsのユニークな制約を省略できないのはなぜですか? 「彼らは目標を提供するために必要です」とはどういう意味ですか? – Hintron

+0

@Hintron:「ドア」内の2つの外部キー制約は、ユニーク制約を参照(ターゲット)する必要があります。 –

関連する問題