编辑:您对仅应用取决于其他属性中值的变量属性的描述是非关系非归一化设计。 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
。