2016-01-22 89 views
0

假設您有一位擁有一家餐廳的廚師,反之亦然。因此,通過one-to-one關係,您可以將廚師表中的主鍵idcook_id作爲餐館表中的主鍵和外鍵。數據庫關係 - 也有一對多的一對一

那麼您如何代表餐廳與其客戶之間的關係one-to-many?由於餐廳沒有自己的ID,客戶表是否有自己的id,然後包含cook_id的外鍵?


編輯:我想過一個更好,更現實的例子。假設您的工單隻有一個報價。您將在quotes表中獲得工作訂單的id,因爲它是1比1。作爲一個報價,它必然會發生變化,同樣的特殊報價也會被修改。如果您想記錄對報價(或某種歷史記錄)進行的修改,則需要類似quote_revisions表。在這種情況下,工單隻能有一個報價,而報價可以有很多報價修訂。你用什麼ID鏈接quotesquotes_revisions表?

+0

1:1很少見。每個餐廳你有一個廚師,他們永遠不會改變? –

+0

這是正確的。我的問題更多的是我想知道的一般設計問題,所以我在編輯過的文章中提供了一個更好的例子。 – kenshin9

回答

1

使用Work_order例如:

  • Work_order會有的,比方說,一個wo_id PK,這可能是AUTO_INCREMENT
  • 行情將具有相同的wo_id PK,但不是AUTO_INCREMENT
  • Quote_revisions將有一個INDEX(wo_id),但一些其他列的PK。

工作訂單和報價是「1:1」,由wo_id提供。

Quotes and Quote_revisions are「1:N」;兩個表中的wo_id都提供了這種關係。

1:1很少有用,但您的示例可能是一個很好的用例。 (一張桌子比較大,靜態比較大,另一個比較小,經常變化)。

+0

這聽起來也符合我的想法。謝謝你的幫助。 – kenshin9

0

我會改爲將restaurant_id字段作爲餐館表中的主鍵,並將cook_id作爲外鍵。是的,這種結構可以支持一對多關係,也可以支持一對一關係,但我相信每個實體都應該擁有自己的ID。如果你喜歡,你可以在外鍵上設置一個唯一的約束,以確保關係保持一對一。或者,您可以只擁有一張餐廳桌,其中包含有關其主廚信息的字段。

2

由於您有一對一的關係,所以廚師的ID也是餐廳的ID。您可以通過將客戶密鑰與餐桌上的廚師/餐廳鑰匙(顧客或其他餐桌)相關聯,將顧客與餐館聯繫起來。一對多基數是通過對客戶的關鍵字設置一個唯一的約束來強制執行的,以便他們不能與多個餐廳/廚師關聯。