2013-06-03 58 views
1

假設我擁有出售汽車和摩托車的業務。我想跟蹤每個數據。我的公司爲每輛車提供免費保修,但我們甚至不提供摩托車保修。起初,我想我有兩個表 - 一個「車」表和「保證」表,像這樣如何正確設計此場景的數據庫模式

Vehicles              Warranties 

VehicleID, SalePrice, VehicleType, WarrantyID    WarrantyID, EffDate, ExpDate 

哪裏VehicleType或者是「車」或「摩托車」。我的缺點是,在車輛表中,每輛摩托車都會有「WarrantyID」的空值。這會被認爲是不好的做法嗎?

另一種方法,我認爲是用三個表像

我的缺點這是我分離摩托車和汽車爲兩個表,幾乎將是相同的。 (實際上,他們會有更多的領域,比如購買成本,里程等等)。唯一的區別是所有的汽車都有保修服務,並且不會有摩托車保修。

(注:我也做的是2或3輛汽車可以共享一個單獨的保修的假設。)

什麼是建立這個數據庫的正確方法?

+0

我認爲第一種方法很好。如果車輛沒有,請保留null。你沒有違反任何規範化規則。 – dewd

+0

你爲什麼假定不止一輛車可以享受同樣的保修? – buritos

+0

你說:_「我也在假設2或3輛車可以共享一個保修單。」_。反之亦然嗎?一輛車可以有多種擔保? –

回答

6

將摩托車和汽車存放在同一張桌子上。

當屬性與給定行中的數據類型不相關時,允許列爲NULL是完全普通的。 NULL表示「未知,丟失或不適用的數據」。

5

聽起來像你可以考慮一個連接表。

Vehicle    VehicleWarranty   Warranty 
---------   ---------------   ---------- 
VehicleId   VehicleId    WarrantyId 
SalePrice   WarrantyId    EffectiveDate 

這樣,您的車輛表中沒有保修ID,因此您不必處理空值。如果您對車輛有保修,則只有保修表格中的條目(和VehicleWarranty表格)。此外,連接表允許您將同一擔保附加到多個車輛,或同一輛車上擔保多個擔保。

+1

「連接表允許您將同一擔保附加到多輛車,或同一輛車上擔保多次。」由於這似乎違背了要求,這實際上是這種方法的一個弱點。 –

+0

來自OP:「(注:我也假設2或3輛車可以共享一個保修單。)」所以這實際上是一個要求。 – Marvo

+2

確切地說,不需要將一輛車與多個擔保結合起來。 –

1

沒有正確的方法,兩種方法都是有效的。這取決於企業的一切。

它是關於車輛,即應用程序中的很多東西處理車輛,而不關心它是汽車還是摩托車,那麼您可能需要一張桌子。

但是,如果大多數業務與其中一個或另一個交易,而不是兩者兼而有之,則完全有可能具有單獨的表格,可能具有兩者結合的視圖。

1

這取決於你要在桌子上使用的用途。

如果您要查詢混合動力汽車列表,那麼您應該選擇第一個型號。

但是,如果你不打算混合他們,你可以使用第二個。

我會選擇第一個,因爲它可以讓您在將來爲自行車提供保修。

0

如果某些車輛的保修是可選的,並且您的假設不是要求,則可以將FK放入保修表中。以下內容還假定車輛和保修之間存在一對一關係(如果存在)。

Vehicle    Warranty 
---------   --------------- 
VehicleId   VehicleId 
SalePrice   EffectiveDate 

缺點是,您將不得不支付外部連接的價格或保修查詢以查明車輛是否帶有一個。

不知道你的查詢模式很難說出什麼最好的。