我在数据库中有基本的泛化模式,我有超级类车辆,它的子类汽车,摩托车。我通过为每个超类/子类组合创建表来实现它们,因此我创建了汽车和摩托车表。
但是现在我有问题,我需要将FK从我的其他表设置为“两个”这些表。所以“人”有摩托车或汽车,但从来没有,从来没有更多。如何将表人与汽车和摩托车联系起来实现这一目标?非常感谢你。
答案 0 :(得分:1)
不要这样做 - 它只会导致痛苦和许多昂贵的连接。
为整个类层次结构提供一个表,并有一个“鉴别器”列,用于以数字或符号方式确定类型。使用psuedo-sql的简单示例:
create table machine {
machine_id int auto_increment,
machine_type char(1), -- can be 'a' for auto or 'm' for motorcyle,
make varchar(255),
model varchar(255),
auto_specific_field varchar(10) null,
moto_specific_field varchar(10) null
}
答案 1 :(得分:0)
您可以使用检查约束或存储过程来执行此操作(具体实现细节取决于您的DBMS)。
但我认为您应该重新考虑整体架构。 继承是 OO概念,显然应该由客户端代码实现,而不是由数据库实现。数据库(至少是关系数据库)并不打算处理这些事情,而且它们并不擅长。无论如何,当你正在做这件事的时候,你正在不必要地努力工作(而且你为许多难以发现的错误打开了大门......)
HTH!