これは確かに可能ですが、データモデルを作成する際の計画が必要です。
すでに述べたように、サブタイプとスーパータイプの関係 (継承) を実装するにはさまざまな方法があります。
1.) オールインワンテーブル
この場合、私はあなたの問題を次のようにモデル化します:
Garage(GarageId_PK, Name)
Vehicle(VehicleId_PK, LicenceNr, GarageId_FK, SomethingOnlyCarsHave, SoemthingOnlyMortorbikesHave, Type)
タイプの場合、ID を指定し、ID を名前に関連付けるか、そこに名前を書き込むだけの別のテーブルを用意できます (あまりクリーンなソリューションではありません!)。ところで、複数の継承が必要な場合 (乗り物には必要ないと思います)、Type をビットマスクにすることもできます。
個人的にはこのアプローチはあまり好きではありませんが、これを行うことはまったく問題ありません。Oracle ie は、研究資料でこれを示唆しています。また、1 つのクエリの問題に対するより簡単な解決策です。
SELECT *
FROM Vehicle v
INNER JOIN Type t ON (v.Type = t.TypeId)
WHERE GarageId = 42
2.) 各サブタイプの表
私には、NULL 値が少ないため、これはよりクリーンなソリューションのように感じますが、1 つのクエリですべてを取得するにはもう少し作業が必要です。
Garage(GarageId_PK, Name)
Vehicle(VehicleId_PK, LicenceNr, GarageId_FK)
Car(VechicleId_PK_FK, SomethingOnlyCarsHave)
Motorbike(VechicleId_PK_FK SoemthingOnlyMortorbikesHave)
これにより、理論的には複数の継承が可能になり、サブタイプのみを許可するトリガーを作成する必要があります。
この場合の SQL:
SELECT *
FROM Vehicles v
LEFT JOIN Car c ON(v.VehicleId = c.VehicleId)
LEFT JOIN Motorbike m ON (v.VehicleId = m.VehicleId)
WHERE GarageId = 42
または、より多くのタイプがある場合は、醜いものをビューに入れることができます:
CREATE OR REPLACE View v_allVehicles AS
(SELECT *
FROM Vehicles v
LEFT JOIN Car c ON(v.VehicleId = c.VehicleId)
LEFT JOIN Motorbike m ON (v.VehicleId = m.VehicleId)
SELECT *
FROM v_allVehicles
編集:
表記について: 名前の後ろに _PK を付けると、列が主キーであることを示します。_外部キーへの FK。