编辑:您对仅根据其他属性中的值适用的变量属性的描述是非关系的、非规范化的设计。RDBMS 可能不是存储此类数据的最佳解决方案。对于需要这种级别的灵活性的数据,RDF 可能是一个很好的解决方案。
我之前关于 RDBMS 解决方案的回答如下:
有些人使用Entity-Attribute-Value设计对灵活的属性进行建模,但这通常过于非结构化,您最终会遇到数据完整性问题。仅当您需要几乎无限数量的实体子类型时才使用此选项。
其他人使用Single Table Inheritance,您将所有子类型使用的所有属性列放入一个非常宽的表中,并在属性与子类型无关的行上将它们保留为 NULL。但这有限制,因为表可能会变得太宽,并且您无法强制任何属性,因为它们都必须可以为空。
如果您的实体子类型数量相对较少,我建议为每组必需属性创建一个依赖表。将依赖表的主键定义为父表的外键,从而获得一对一的关系。
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)
);
您还可以通过在父表的主键中编码子类型来提供更多的数据完整性。这是为了确保 row inAutomobiles
不能引用 in 中的摩托车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 属性等。
您需要在应用程序逻辑中强制执行的唯一部分是确保为= 'Automobile'中的Automobiles
每一行创建一行。Vehicles
vehicle_type