[英]Three-way Referential Integrity - SQL Server 2008
我正在使用SQL Server 2008構建一個數據庫來存儲在多個市場上交易的證券的價格。
對於特定市場,所有證券都具有相同的假日日歷。 但是,假日日歷因市場而異。
我想要以下四個表: Market , GoodBusinessDay , Security和SecurityPriceHistory ,並且我想強制執行SecurityPriceHistory在交易證券交易市場關閉時的工作日沒有行。
表中的字段如下:
市場:MarketID(PK),MarketName
GoodBusinessDay:MarketID(FK),SettlementDate(該對是PK)
安全性:SecurityID(PK),MarketID(FK),SecurityName
SecurityPriceHistory:這是問題 - 我的偏好是SecurityID,SettlementDate,SecurityPrice
如何以這種方式定義表並保證對於SecurityPriceHistory中的每一行, GoodBusinessDay中都有相應的行?
如果我將MarketID列添加到SecurityPriceHistory 。 我可以看到我如何使用兩個外鍵(一個指向安全和一個指向GoodBusinessDay ),但這似乎不是正確的方法。
這個模型應該做。 Market和BusinessDay之間的關系是識別 ,即商業日不屬於它所屬的市場環境。
同樣,BusinessDay和SecurityPriceHistory之間的關系正在識別Security和SecurityPriceHistory之間的關系。
這意味着SecurityPriceHistory的主鍵是composite:security_id,market_id和settlement_date。
這將強制執行約束,即對於給定的市場/營業日,每個安全性在SecurityPriceHistory中可能不超過一行。 然而,盡管安全性與特定市場的關系,它確實允許在多個市場中進行相同的證券交易:為了限制這一點,市場和證券之間的關系需要識別,因此:
SecurityPriceHistory
可能有一個FK到GoodBusinessDay
和沒有FK到Market
。 您可以通過加入GoodBusinessDay
表來弄清楚市場。 我真的不喜歡這個選項,但這是一種可能性。
您還可以使用觸發器檢查並確保插入/更新時存在正確的GoodBusinessDay記錄,否則拒絕該事務。
我認為你需要securityPriceHistory表中的marketID字段,假設同一goodBusinessDay可以在不同的市場上銷售相同的securityID。
按照你想的方式設置它很好。 你有一個父母,兩個相關的孩子,然后是一個與兩個孩子有關系的孫子。
即使證券只能在一個市場上出售,我仍然會在securityPriceHistory表中包含marketID,其中包含兩個復合FK,MarketDay和MarketSecurity。 這樣清楚,IMO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.