我有一个名为Vehicles的mysql数据库表。 这张表有很多行:汽车,直升机,飞机等。
我希望这些行中的每一行都有自己的表格,因此我可以为每种车辆类型提供不同的数据。
我的问题是,如何创建此表,以便每行不引用另一个表上的另一行,而是引用表本身。我想过只使用表名,但感觉有点hackish。
答案 0 :(得分:0)
如果我正确地读了这个,你会想到一个Base或Master实体表来保存车辆共有的所有属性,然后是一个派生表,用于表示与每辆车相关的所有属性。
这样的东西可以保持数据的完整性并且可以扩展:
create table Vehicles(
ID int not null auto_generated primary key,
VType char( 1 ) not null check( VType in( 'C', 'H', 'P' )),
... <other common attributes>,
constraint UQ_ID_VType unique( ID, VType )
);
create table cars(
ID int not null primary key,
VType char( 1 ) not null check( VType = 'C' ),
... <other car-only attributes>,
constraint FK_Car_Vehicle foreign key( ID, VType )
references Vehicles( ID, VType )
);
create table Helicopters(
ID int not null primary key,
VType char( 1 ) not null check( VType = 'H' ),
... <other helicopter-only attributes>,
constraint FK_Helicopter_Vehicle foreign key( ID, VType )
references Vehicles( ID, VType )
);
等。车辆表格只能包含已定义的车辆类型,每个子表格只能包含其特定的车辆类型,并且每个ID /类型组合必须首先存在于车辆中。除此之外,每个人都可以定义描述其特定车辆类型所需的任何属性。要添加摩托车,请将“M”添加到“车辆”表的“VType”字段的检查约束中,并创建一个“M”作为其 VType字段的唯一可接受值的“摩托车”表。
如果你拥有的只是车辆ID值,你可以在车辆表中找到它,以找出类型 - 汽车,直升机等 - 并告诉你要访问哪个子表来获取其余的信息。
作为替代方案,它有助于扩展因子,使Vehicles表的VType字段成为VehicleTypes表的FK。然后,您不必重新定义表本身以添加新类型的车辆。