mysql 排他关系的可能性
Posted
技术标签:
【中文标题】mysql 排他关系的可能性【英文标题】:mysql exclusive relation possibility 【发布时间】:2015-04-22 12:41:26 【问题描述】:mysql是否支持排他关系? 例如,我有 3 个表:CUSTOMER、FLAT、HOUSE。 CUSTOMER 与 FLAR xor HOUSE 相关。
如果 mysql 有可能使用一种关系呢? 就像,CUSTOMER 将有 2 个字段,一个与对象相关(FLAT 或 HOUSE),一个是存储的 id。 我想在数据库级别检查这个关系不为空。不想为每个表(FLAT 和 HOUSE)创建外键。
谢谢。
稍后添加: 抱歉解释不正确。我不想为每个外键(到 FLAT,到 HOUSE)创建两个不同的列。我建议有类似排他关系的东西,我为 id 创建一列,它可以是表 FLAT 或 HOUSE 之一的外键
【问题讨论】:
这似乎是使用抽象层的好理由。客户应该有一个住所。然后,住宅可以链接到特定类型,例如公寓或房屋。 @GeorgeCummins 谢谢,乔治。好的,我有客户和住宅之间的关系。但是如何检查 DWELLING(FLAT 或 HOUSE)的关系之一是否为空? 【参考方案1】:create table flat (
id int auto_increment,
primary key (id)
);
create table house (
id int auto_increment,
primary key (id)
);
create table customer (
id int auto_increment,
flat_id int,
house_id int,
primary key (id),
index flat_id (flat_id),
index house_id (house_id),
foreign key (flat_id) references flat(id) on delete cascade,
foreign key (house_id) references house(id) on delete cascade
);
【讨论】:
但这错过了两张桌子、公寓和房子的 FK @Vladimir Kovpak,谢谢。但我想使用从 CUSTOMER 到 FLAT(HOUSE)的 MTO 关系。因此,如果我删除 FLAT(HOUSE) 对象,它将被删除与之相关的 CUSTOMER 对象。没有外键可以解决 @Luis Siquot wazz 写道:不想为每个表(FLAT 和 HOUSE)创建外键。 @VladimirKovpak 抱歉解释不正确。我不想为每个外键(到 FLAT,到 HOUSE)创建两个不同的列。我建议有类似排他关系的东西,我为 id 创建一列,它可以是表 FLAT 或 HOUSE 之一的外键 @wazz 最后一个例子更接近你的愿望吗?)【参考方案2】:我认为最好使用基本父表来解决我的问题。
感谢乔治康明斯的评论。 我可以创建只有 id 字段的 DWELLING 表。
CREATE TABLE DWELLING (
ID INT NOT NULL AUTO_INCREMENT
, PRIMARY KEY (ID)
);
并将 FK 添加到 CUSTOMER、FLAT、HOUSE 表中。
CREATE TABLE FLAT (
ID INT NOT NULL AUTO_INCREMENT
, DWELLING_ID INT NOT NULL
, PRIMARY KEY (ID)
, CONSTRAINT FK_DWELLING_FLAT FOREIGN KEY (DWELLING_ID) REFERENCES DWELLING (ID) ON DELETE cascade
);
CREATE TABLE HOUSE (
ID INT NOT NULL AUTO_INCREMENT
, DWELLING_ID INT NOT NULL
, PRIMARY KEY (ID)
, CONSTRAINT FK_DWELLING_HOUSE FOREIGN KEY (DWELLING_ID) REFERENCES DWELLING (ID) ON DELETE cascade
);
CREATE TABLE CUSTOMER (
ID INT NOT NULL AUTO_INCREMENT
, DWELLING_ID INT NOT NULL
, PRIMARY KEY (ID)
, CONSTRAINT FK_DWELLING_CUSTOMER FOREIGN KEY (DWELLING_ID) REFERENCES DWELLING (ID) ON DELETE cascade
);
之后如果需要删除公寓或房屋,我必须删除相关的DWELLING对象。
我使用了这个http://www.slideshare.net/billkarwin/practical-object-oriented-models-in-sql,幻灯片 29
如果您不同意我的观点,请添加评论。我很高兴看到你的 cmets。
谢谢。
【讨论】:
以上是关于mysql 排他关系的可能性的主要内容,如果未能解决你的问题,请参考以下文章