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 排他关系的可能性的主要内容,如果未能解决你的问题,请参考以下文章

Mysql的排他锁和共享锁

关于mysql 共享锁和排他锁 互斥问题?

数据库系统原理:封锁

一文搞懂mysql中的共享锁排他锁悲观锁乐观锁以及使用场景

一文搞懂mysql中的共享锁排他锁悲观锁乐观锁以及使用场景

Activiti排他网关上的多条件组合判断