2017-03-09 41 views
0

我的車輛表包含一些可以同時考慮公共汽車和汽車的信息。但我還需要一輛公共汽車或汽車的特定數據。數據庫結構當表可以與其他表相關 - 但只應該與當時的一個相關

難道是正確的做到這一點:

Table Vehicle 
Bus_id (ref key) 
Car_id (ref key) 

Table Bus 

Table Car 

然後車輛可以參考汽車和公交車的同時,它不應該。

或者像這樣:

Table Vehicle 

Table Bus 
Vehicle_id (ref key) 

Table Car 
Vehicle_id (ref key) 

但同樣,公共汽車和一輛汽車可以在相同的時間基準相同的車輛信息。

如何才能實現車輛信息,如果它具有特定的數據,那麼只涉及公交車或汽車?

+0

這三張桌子爲什麼不能合併成一個? – e4c5

+0

不要爲每種類型的車輛添加一列到車輛表中。這是一條糟糕的路。相反,您應該在您的Vehicle表格中添加VehicleType,以便了解它是哪種類型的車輛。你可以通過使用一個序列來消除從公共汽車和汽車使用相同的ID的問題,從而每個車輛都有唯一的ID,而不管其類型。 –

+0

@SeanLange這不僅僅是爲了定義車輛類型,而且因爲公共汽車表具有與公共汽車相關的數據,同樣,汽車表具有與汽車相關的數據。否則,我會在Vehicle中使用VehicleType。 – user1281991

回答

2

如果你想SQL服務器,以幫助執行這一點,你可以用一個指向巴士或汽車,在你的第一個例子中的車輛臺去,並使用檢查約束和過濾索引來實現:

CREATE TABLE VEHICLE (
    [VEHICLE_RECID] integer IDENTITY PRIMARY KEY CLUSTERED, 
    [BusID] integer NULL REFERENCES [BUS] ([BUS_RECID]), 
    [CarID] integer NULL REFERENCES [CAR] ([CAR_RECID]), 
    CONSTRAINT [CK_VEHICLE_OnlyCarOrBus] CHECK (
     ([BusID] IS NULL AND [CarID] IS NOT NULL) 
     OR ([BusID] IS NOT NULL AND [CarID] IS NULL)) 
)); 

CREATE UNIQUE INDEX [BusID] ON VEHICLE ([BusID]) WHERE [BusID] IS NOT NULL 
CREATE UNIQUE INDEX [CarID] ON VEHICLE ([CarID]) WHERE [CarID] IS NOT NULL 
+0

謝謝你的解決方案Tim。這似乎是工作。但是你也善意地暗示這可能不是正確的做法?如果是這樣,如果我可以問,你會怎麼做? (將其提升到業務邏輯?) – user1281991

+0

雖然這將起作用,請考慮添加更多車型時的情況。這不是一個正常化的解決方案。 –

+0

@SeanLange我理解並同意。你能幫助我朝正確的方向發展,那麼這將是一個很好的標準化解決方案嗎?最好的祝福 – user1281991

相關問題