【问题标题】:Three-way Referential Integrity - SQL Server 2008三向参照完整性 - SQL Server 2008
【发布时间】:2011-05-19 17:10:17
【问题描述】:

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

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

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

表格中的字段如下:

市场:市场 ID (PK)、市场名称

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

安全性:SecurityID (PK)、MarketID (FK), 安全名称

SecurityPriceHistory:这是 问题 - 我的偏好是 证券 ID、结算日期、 安全价格

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

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

【问题讨论】:

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


    【解决方案1】:

    这个模型应该可以。 Market 和 BusinessDay 之间的关系是标识,也就是说,一个工作日在它所属的市场范围之外不存在。

    类似地,BusinessDay 和 SecurityPriceHistory 之间的关系正在识别,就像 Security 和 SecurityPriceHistory 之间的关系一样。

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

    这将强制实施限制,即在给定的市场/营业日,每只证券在 SecurityPriceHistory 中的行数不得超过一行。然而,它确实允许同一证券在多个市场中交易,尽管证券与特定市场有关系:为了限制这一点,需要确定市场和证券之间的关系,因此:

    【讨论】:

    • 另一件需要注意的事情:使证券交易市场关系成为一种识别关系意​​味着它会使证券从 NYSE 转移到 NASDAQ 变得复杂,因为市场 ID 是安全的主键。只是要记住的事情。
    • 这是接近 4NF 和 5NF 顺便说一句(我并没有考虑太深......)
    • 感谢您的警告 - 考虑到实际的证券/市场(例如美国债券与欧洲债券,而不是在纽约证券交易所交易的美国股票与在纳斯达克交易的美国股票),我对假设市场对于给定的证券永远不会改变。
    【解决方案2】:

    SecurityPriceHistory 可以有一个指向 GoodBusinessDay 的 FK,而没有指向 Market 的 FK。您可以通过加入GoodBusinessDay 表了解市场。我不是很喜欢这个选项,但这是可能的。

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

    【讨论】:

      【解决方案3】:

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

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


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

      【讨论】:

      • 给定的 SecurityID 始终在同一个 MarketID 上交易(不是多对多)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多