編輯:您對僅應用取決於其他屬性中值的變量屬性的描述是非關係非歸一化設計。 RDBMS可能不是存儲這類數據的最佳解決方案。對於需要這種靈活性的數據來說,RDF可能是一個很好的解決方案。
我剛纔的答覆,關於RDBMS的解決方案,下面是:與Entity-Attribute-Value設計
有人模型靈活的屬性,但這往往是太非結構化和你結束了數據完整性問題的戰鬥。僅當您需要實際上無限數量的實體子類型時才使用它。
其他人使用Single Table Inheritance,您將所有子類型使用的所有屬性列放入一個非常寬的表中,並在屬性與子類型無關的行上將它們留空。但是這有侷限性,因爲表格可能變得太寬,而且你失去了強制使用任何屬性的能力,因爲它們必須都是可空的。
如果實體子類型數量較少,我建議爲每組必需屬性創建一個從屬表。定義從屬表的主鍵作爲父表的外鍵,因此您可以獲得一對一的關係。
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)
);
當然,你需要創建一個新的從屬表在每次定義一個新的子類時,但這樣的設計確實給你更多的結構,以保持數據完整性,NOT NULL屬性,等等。
您需要在應用程序邏輯中強制執行的唯一部分是確保在Vehicles
的 ='Automobile'中爲每行創建一行Automobiles
。