2017-03-09 8 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

これらの3つのテーブルをマージできない理由は何ですか? – e4c5

+0

車両テーブルに車両の種類ごとに列を追加しないでください。これは悪い方法です。代わりにVehicleTypeをVehicleテーブルに追加して、その車両のタイプを知る必要があります。あなたは列車を使用してバスと車から同じIDを持っているという問題をなくし、すべての車両がその種類にかかわらず一意のIDを持つようにします。 –

+0

@SeanLangeこれはVehicleタイプを定義するだけでなく、Busテーブルにバス関連のデータがあるためCarテーブルもCar関連のデータを持ちます。さもなければ、私はVehicleTypeをVehicleで使ったでしょう。 – 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

関連する問題