4

私は 3 つのテーブルを持っています (それらを Foo、Bar、Baz と呼びましょう。

テーブル:

フー

  • FooId

バー

  • BarId
  • FooId

バズ

  • BazId
  • BarId
  • アナザーバリュー

明らかに、外部キーにより、各 Baz が Bar に関連付けられ、したがって Foo に関連付けられます。ここで、同じ「AnotherValue」を持つ Baz の各セットに対して、関連するすべての Foo が一意であることを確認したいと思います

たとえば、私が持っていた場合

Foos (1, 2, 3)
Bars ((10, 1), (11, 1), (12, 1), (13, 2))
Bazs ((100, 10, "a"), (101, 10, "b"), (102, 13, "a"), (104, 11, "b"))

Baz 104 と baz 101 の両方に AnotherValue "b" と Foo 1 があるため、これはブロックする必要があります。


私が考えた選択肢(現在の好みの順)

インデックス付きビュー

これら 3 つのテーブルのビューを作成し、2 つの列に一意のインデックスを配置できます。

計算列

FooId を計算列として Baz に追加します。次に、AnotherValue と FooId にインデックスを追加します。

制約をチェック

これを追加して機能させることができると確信しています。私はチェック制約をあまり使用していません。これが最善の方法であるかどうかはわかりません。

引き金

これは私には醜いようです。

4

2 に答える 2

1

質問を完全に理解しているかどうかはわかりませんが、FooId を Baz テーブルに運び、FooId、AnotherValue に代替キー (一意の制約) を追加したいようです。

Baz
•BazId
•BarId
•FooId
•AnotherValue
于 2011-05-23T16:46:10.523 に答える
0

別の名前を使用して言い直すだけです:

Parent (ParentID) 
       (1, 2)
Child (ChildID, ParentID) 
       ((10, 1), (11, 1), (13, 2))
GrandChild (GCID, ChildID, GCAndParentVal) 
       ((100, 10, "a"), (101, 10, "b"), (102, 13, "a"), (104, 11, "b"))

そのフィールドを、childID を持つテーブルに含めるのではなく、parentID と baz.anotherValue を持つ別のテーブルに含めることはできますか?

このような:

Parent (ParentID) 
       (1, 2)
Child (ChildID, ParentID) 
       ((10, 1), (11, 1), (13, 2))
GrandChild (GCID, ChildID, ...) 
       ((100, 10, ...), (101, 10, ...), (102, 13, ...), (104, 11, ...))
AnotherChildValue (ParentID, AnotherVal)
       ((1, "a"), (1, "b"), (2, "a"), (1, "b"))
于 2010-10-07T15:33:23.213 に答える