2010-09-21 66 views
4

什麼是在這種情況下,推薦的方法:SQL Server表關係實踐

Customer ..* <-------------> 0..1 Car 

因此,有一個客戶表和一個汽車表,客戶可以有零或一個車型,該車可掛多客戶表。

  • 我應該增加一個可空CarID列客戶 或
  • 我應該創建一個包含客戶ID和CarID

一個Customer_Car_Map表我問這個,因爲我不知道是否有可以使用空的外鍵?

+0

它是什麼類型的業務?正如Vash所說,註冊系統與客戶(1) - >(n)汽車的關係是不同的。對於租賃業務,您希望重複客戶並保留租賃歷史記錄,您可以:客戶(n) - >(n)汽車。 – pascal 2010-09-22 08:27:29

回答

5

只要你確定100%的客戶將永遠不會有超過1路車,請遵循你的第一個建議。如果你認爲甚至有可能擴展成多對多的關係,那麼現在就選擇第二種選擇,以便在未來避免頭痛。

+1

正是我的思考過程。 – 2010-09-21 15:30:48

+1

我仍然傾向於多對多,並使用觸發器來執行直接的業務規則。如果未來業務規則放鬆,則工作量減少。 – 2010-09-21 15:36:02

1

我會做第一個解決方案,它要簡單得多。使用其他解決方案,您需要一個關鍵或唯一的約束條件來確保每個用戶不會有多輛車。如果後來被允許,您需要對任一解決方案進行架構更改,因此,請選擇簡單的架構。

0

只有當您確信客戶在您的決定實施後沒有大量汽車時,您纔可以將此列CarId添加到客戶表中。

,如果你不喜歡這樣你也可以有很多汽車,只要你喜歡任何特定的客戶:

Car: CarId, CustomerId, MakeId, ModelId, Color, PlateNumber, VIN 
Customer: CustomerId, LastName, FirstName, MiddleName 
0

這是一個平衡的行爲,一方面它的想法是沒有任何數據庫中的空值。

但是,如果您將該規則設置爲石頭,您最終可能會得到一些難以維護的大量聯接語句。

如果你確定它將成爲一對一的關係只有兩個表。

0

恕我直言,映射取決於應呈現的情況。

例如,如果這是一個國家汽車註冊表,那麼一個人可能有很多汽車,但一輛汽車應該擁有一個車主。您的第一個解決方案的良好表現是我們想知道哪輛車設置了某人,因爲在這種情況下,很難同時在兩個地方。對於一般情況下更好的解決方案是多對多的,我會選擇這種解決方案的優勢,在不久的將來,一個人將能夠擁有更多的一輛車。

*應該因爲有可能一輛車有兩個車主。