編集:他の属性の値にのみ依存して適用される変数属性の説明は、非リレーショナル、非正規化の設計です。RDBMSは、この種のデータを保存するための最良のソリューションではない場合があります。おそらくRDFは、このレベルの柔軟性を必要とするデータに適したソリューションになるでしょう。
RDBMSソリューションに関する私の以前の回答は次のとおりです。
Entity-Attribute-Value設計を使用して柔軟な属性をモデル化する人もいますが、これは構造化されていないことが多く、データの整合性の問題と戦うことになります。これは、実質的に無制限の数のエンティティサブタイプが必要な場合にのみ使用してください。
他の人は単一テーブル継承を使用します。この場合、すべてのサブタイプで使用されるすべての属性列を1つの非常に幅の広いテーブルに配置し、属性がサブタイプに関係のない行ではNULLのままにします。ただし、テーブルが大きくなりすぎる可能性があるため、これには制限があります。また、属性はすべてnull許容である必要があるため、属性を必須にすることはできません。
エンティティサブタイプの数が比較的少ない場合は、必要な属性のグループごとに依存テーブルを作成することをお勧めします。従属テーブルの主キーを親テーブルの外部キーとして定義して、1対1の関係を取得します。
CREATE TABLE Vehicles (
vehicle_id INT PRIMARY KEY
...attributes common to all vehicles...
);
CREATE TABLE Automobiles (
vehicle_id INT PRIMARY KEY,
...attributes specific to autos...
FOREIGN KEY (vehicle_id) REFERENCES Vehicles(vehicle_id)
);
親テーブルの主キーでサブタイプをエンコードすることにより、もう少しデータの整合性を提供することもできます。これは、の行がAutomobiles
のオートバイを参照できないようにするためVehicles
です。
CREATE TABLE Vehicles (
vehicle_id INT,
vehicle_type VARCHAR(10),
...attributes common to all vehicles...
PRIMARY KEY (vehicle_id, vehicle_type),
FOREIGN KEY (vehicle_type) REFERENCES VehicleTypes (vehicle_type)
);
CREATE TABLE Automobiles (
vehicle_id INT,
vehicle_type VARCHAR(10) CHECK (vehicle_type = 'Automobile'),
...attributes specific to autos...
FOREIGN KEY (vehicle_id, vehicle_type)
REFERENCES Vehicles(vehicle_id, vehicle_type)
);
もちろん、新しいサブタイプを定義するたびに新しい依存テーブルを作成する必要がありますが、この設計では、データの整合性やNOTNULL属性などを適用するための構造が大幅に強化されています。
アプリケーションロジックで適用する必要がある唯一の部分は、='Automobile'で各行に行を作成することを確認することですAutomobiles
。Vehicles
vehicle_type