【问题标题】:Creating and referencing a table of tables创建和引用表的表
【发布时间】:2026-01-15 07:05:01
【问题描述】:

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

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

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

【问题讨论】:

  • 并不是说我允许为每种类型的交通工具使用单独的表,但您可以将 VehicleID 作为外键。它的值对于表中的每条记录都是相同的......
  • 问题是它们有非常不同的属性,所以我想我需要为每一个单独的表。
  • 我会认真考虑是否需要查询所有车辆而不考虑类型如果这样单独的表会很痛苦,除非你有一个所有车辆的主表并且子表只包含每种类型所需的附加属性。这也可以通过几个表属性(基类以外的任何车辆的所有属性列表)、VehicleTypeAttribute(与每种类型及其数据类型相关的属性列表、VehicleAttribute(每个车辆类型属性的用户定义值列表)来实现。)
  • 是的,这个想法是让子表具有附加属性。我只是不知道如何正确链接或引用它们。似乎在所有字段上都使用表名和外键“丑陋”的解决方案..专业人士如何做到这一点?
  • 这不是vehicleID之间的1-1关系吗?至于专业人士是如何做到的......视图,动态SQL,过程的使用......使用左连接到子表,过程调用不同的选择取决于“车辆类型”所以你只留下加入你的需要...这是不同的数据和不同的列。所以 SQL 必须有所不同。或者您必须执行上述操作并将设计扁平化,并处理不同的数据类型。两种方法都已使用。 Purest in database 会告诉你编写单独的表,而查询编码员会告诉你开销太大。

标签: mysql sql


【解决方案1】:

如果我没看错的话,您正在考虑使用 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 )
);

等等。 Vehicles 表只能包含已定义的车辆类型,每个子表只能包含其特定的车辆类型,并且每个 ID/Type 组合必须首先存在于 Vehicles 中。除此之外,每个人都可以定义描述其特定车辆类型所需的任何属性。要添加 Motorcycle,请将“M”添加到 Vehicles 表的 VType 字段的检查约束中,并创建一个 Motorcycles 表,其中“M”作为 its VType 字段的唯一可接受值。

如果您只有车辆 ID 值,您可以在 Vehicles 表中找到该值以找出类型 - 汽车、直升机等 - 并告诉您访问哪个子表以获取其余部分信息。

作为替代方案,它有助于提高可伸缩性,让 Vehicles 表的 VType 字段成为 VehicleTypes 表的 FK。这样您就不必重新定义表本身来添加新类型的车辆。

【讨论】:

    最近更新 更多