三向参照完整性 - SQL Server 2008

时间:2011-05-19 17:10:18

标签: sql-server foreign-key-relationship referential-integrity

我正在使用 SQL Server 2008 构建数据库,以存储在多个市场上交易的证券的价格。

对于特定市场,所有证券都有相同的假期日历。但是,假日日历因市场而异。

我想要以下四个表:市场 GoodBusinessDay 安全 SecurityPriceHistory ,我想要强制执行 SecurityPriceHistory 在交易证券交易市场关闭时没有工作日行。

表格中的字段如下:

  

市场:MarketID(PK),MarketName

     

GoodBusinessDay:MarketID(FK),   SettlementDate(该对是PK)

     

安全性:SecurityID(PK),MarketID   (FK),SecurityName

     

SecurityPriceHistory:这是   问题 - 我的偏好是   SecurityID,SettlementDate,   SecurityPrice

如何以这种方式定义表并保证 SecurityPriceHistory 中的每一行, GoodBusinessDay 中都有相应的行?

如果我将 MarketID 的列添加到 SecurityPriceHistory 。我可以看到我如何使用两个外键(一个指向安全,另一个指向 GoodBusinessDay )执行此操作,但这似乎不是正确的方法做到这一点。

3 个答案:

答案 0 :(得分:1)

这个模型应该这样做。 Market和BusinessDay之间的关系是识别,也就是说,在它所属的市场环境之外不存在营业日。

同样,BusinessDay和SecurityPriceHistory之间的关系正在识别,因为它与SecurityPriceHistory之间的关系。

这意味着SecurityPriceHistory的主键是复合的:security_id,market_id和settlement_date。

take 1

这将强制执行约束,即对于给定的市场/营业日,每个证券在SecurityPriceHistory中可能不超过一行。然而,尽管安全性与特定市场的关系,它确实允许在多个市场中进行相同的证券交易:为了限制这一点,市场和证券之间的关系需要确定,因此:

take 2

答案 1 :(得分:0)

SecurityPriceHistory可以有GoodBusinessDay的FK和Market的无FK。您可以通过加入GoodBusinessDay表来了解市场。我真的不喜欢这个选项,但这是可能的。

您还可以使用触发器检查并确保插入/更新时存在正确的GoodBusinessDay记录,否则拒绝该事务。

答案 2 :(得分:0)

我认为你需要securityPriceHistory表中的marketID字段,假设同一goodBusinessDay可以在不同的市场上销售相同的securityID。

按照你的想法设置它很好。你有一个父母,两个相关的孩子,然后是一个与两个孩子都有关系的孙子。


即使证券只能在一个市场上出售,我仍然会在securityPriceHistory表中包含marketID,其中包含两个复合FK,MarketDay和MarketSecurity。这样清楚,IMO。