创建和引用表的表

时间:2015-01-29 19:40:55

标签: mysql sql

我有一个名为Vehicles的mysql数据库表。 这张表有很多行:汽车,直升机,飞机等。

我希望这些行中的每一行都有自己的表格,因此我可以为每种车辆类型提供不同的数据。

我的问题是,如何创建此表,以便每行不引用另一个表上的另一行,而是引用表本身。我想过只使用表名,但感觉有点hackish。

1 个答案:

答案 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。然后,您不必重新定义表本身以添加新类型的车辆。