实施此数据完整性约束的最佳方法是什么?

时间:2010-10-07 14:55:32

标签: sql-server data-integrity

我有3张桌子(我们称之为Foo,Bar和Baz。

表:

  • FooId

酒吧

  • BarId
  • FooId

巴兹

  • BazId
  • BarId
  • AnotherValue

显然,外键使得每个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上添加一个索引。

检查约束

我很确定这可以添加并且可以使用。我没有太多使用检查限制,我不确定这是否是最好的方法。

触发

这对我来说似乎很难看。

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解这个问题,但似乎你想将FooId带到Baz表并在FooId,AnotherValue上添加一个备用键(唯一约束)。

Baz
•BazId
•BarId
•FooId
•AnotherValue

答案 1 :(得分: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"))