4

我有 3 张桌子(我们称它们为 Foo、Bar 和 Baz。

表:

  • FooId

酒吧

  • 条码
  • FooId

巴兹

  • 巴兹德
  • 条码
  • 另一个价值

显然,外键使得每个 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。


我想到的选项(按我当前的偏好排序)

索引视图

我可以在这三个表上创建一个视图,并在两列上放置一个唯一索引

计算列

将 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"))

您能否将该字段放在另一个具有 parentID 和 baz.anotherValue 的表中,而不是将其包含在具有 childID 的表中?

像这样:

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 回答