0

從以下三個表,問題就出現完整性約束 -強制閉環外鍵約束

Tour 
- Id 

TourPackage 
- Id 
- TourId 

Traveller 
- Id 
- TourId 
- PackageId 

外鍵約束到位。不過,我也希望執行該旅行者套餐也必須參考旅行者所提及的相同旅行。

Traveller.Tour = Traveller.Package.Tour 

我可能能夠輕鬆地在業務層上強制執行此操作,但是可以在數據庫中執行此操作嗎?還是應該重新考慮我的設計?請注意,我不打算在新的關係表中提取外鍵。我認爲Tour和Package是Traveler實體的一部分,因此應該駐留在實體本身中。

UPDATE

我的應用程序的單一旅遊的上下文中運行。因此,我加載的所有數據都會指向單個遊覽。此外,大部分數據來自Traveler表。所以,有一個直接TourId到桌上是有道理的。無論如何,我以這種方式來看待關係。

  • 一個旅遊有幾個包。
  • 一位旅行者參加旅行。
  • 旅行者爲訂購的旅程選擇包裹。

所以,我猜旅遊者和旅行者之間的關係是合理的。我錯了嗎?

+0

首先將TourId存儲在旅行者中有什麼好處? – ryanbwork 2013-03-07 19:58:10

+0

@ryanbwork - 請看看最新的問題。 – 2013-03-07 20:05:42

回答

3

首先,可以使用外鍵來強制Traveler表中的TourIdPackageId引用保持一致。 FORIEGN KEY TRAVLELLER(TOURID, PACKAGEID) REFERENCES PACKAGE(TROURID, ID)以及TourPackage表上的唯一(TOURID,ID)。

關於您的數據模型,如果旅程有幾個包並且旅行者只需要一個包,則Traveler表中不需要TourId字段。您可以通過加入三個表格來找到TourId。

但是,如果旅行者被允許在旅遊中登記多個包裹,那麼你需要一個關係表來將旅行者與多個包裹聯繫起來。

1

enter image description here

,或者取決於你如何定義 「包」。

enter image description here

+0

不錯的圖片,但都沒有設計反映'Traveller'中的'TourID'是冗餘/非規範化的。 – Hazzit 2013-03-09 22:03:49

+0

@Hazzit - 請解釋一下? – 2013-03-10 15:55:54

+0

PackageID和TourID具有N:1的關係。旅遊有* n *套餐,一個套餐屬於1次旅遊。雖然旅行者「首先選擇一次旅行,然後選擇一個包裹」,但存儲包裹ID已足夠,因爲它意味着選擇了哪個旅程。你提出的兩個Traveller表都存儲一個TourID和一個PackageID。這是多餘的。這也使得維護系統的完整性變得更加困難 - 人們可以在屬於完全不同的TourID的Traveller表中存儲一個PackageId。 – Hazzit 2013-03-10 16:03:37