2017-09-22 86 views
0

中間表中的組合主鍵中的屬性是否可以爲null?我有三元關係,兩個實體有子類。這個子類有它們自己唯一的主鍵。中間表的主鍵由子類的主鍵組成(見下圖),所以有些時候某些屬性會爲空。在三元關係中映射子類

我向中間表下訂單。你可以看到有些時候這些屬性是空的。例如,客戶從餐館菜單中訂購了一些東西,然後餐飲訂單ID將爲空。它是這樣做的嗎?如果不是,應該怎麼做?

enter image description here

回答

2

複合鍵字段不能爲空。 customermenu應該隱藏其各自的抽象,以便orders不具有對特定類型的客戶或菜單的強烈依賴性。如果你需要一箇中間表,給它一個合成的主鍵,並處理餐廳和餐飲菜單之間的區別。使用表繼承(如果您有Postgres)或視圖來表示每種類型的客戶或菜單的完整數據集。

但首先確保你真的需要將這些表分開 - 外鍵爲空是可以的,但首先使用較少的表和外鍵會使應用程序邏輯更加容易。

+0

因此,對於中間訂單()表,我應該交換來自菜單子類表餐廳和餐飲菜單的兩個主鍵嗎?因此,用超類菜單中的主鍵替換這兩個鍵,然後使用三個外鍵將該主鍵鏈接回這三個表? – Rubiks

+0

'orders'應該有'customer_id'和'menu_id'外鍵,每一列分別指向'customers'和'menus'中的單列主鍵。如果你需要將餐廳和餐飲菜單分成不同的表格(仔細考慮一下 - 一張桌子上的稀疏數據不是世界上最糟糕的東西!),菜單應該有'restaurant_menu_id'和'catering_menu_id'外鍵,其中任何一個可能爲空。您可以使用檢查約束來確保至少有一個值具有值。 – dmfay