代码之家  ›  专栏  ›  技术社区  ›  tster

执行此数据完整性约束的最佳方法?

  •  4
  • tster  · 技术社区  · 14 年前

    桌子:

    酒吧

    • 巴里德

    巴兹

    • 巴兹德
    • 其他值

    显然,外键使得每个Baz都与一个Bar相关联,从而与一个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都有另一个值“b”和Foo 1。


    我想到的选择 (根据我目前的喜好)

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

    计算列

    将FooId作为计算列添加到Baz。然后在另一个值和FooId上添加一个索引。

    我很确定这个可以添加并且会起作用。我很少使用检查约束,我不确定这是否是最好的方法。

    触发

    2 回复  |  直到 14 年前
        1
  •  1
  •   JNappi    13 年前

    我不确定我是否完全理解这个问题,但似乎您想把FooId带到Baz表中,并在FooId上添加一个备用键(惟一的containt),另一个值。

    Baz
    •BazId
    •BarId
    •FooId
    •AnotherValue
    
        2
  •  0
  •   Beth    14 年前

    只是用不同的名字重新开始:

    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"))
    
    推荐文章