在数据库中使用循环fk引用

du7egjpx  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(465)

我有两个(mysql)表-- company 以及 user . 它们的结构如下:

`user`
- id
- company_id (FK to company)
- name

`company`
- id
- name
- admin_user_id (FK to user)

这个 user 表的外键 company 表,反之亦然。
我在想,如果上面的模式是好的,如果不是为什么它不是,可以做些什么来改善它。

ujv3wf0j

ujv3wf0j1#

如果它是您业务领域的准确表示,那么这才是真正重要的。然而,sql中可能存在一个问题。sql只允许一次更新一个表,所以公司或用户必须排在第一位。通常,当您插入一个没有相应用户的新公司时,或者插入一个没有相应公司的新用户时,您必须允许临时打破约束。要实现这一点,可以使其中一个外键为空,也可以暂时禁用约束。
有些数据建模者不喜欢循环依赖关系,即使在纯粹的概念模型中,sql的限制是不相关的。在我看来,有些人会将循环依赖性视为建模错误。不赞成循环依赖似乎与er建模特别相关。有趣的是,循环自引用依赖在对象角色建模中被认为是理所当然的,甚至有一个特殊的表示法(环约束)。

wvt8vs2t

wvt8vs2t2#

在较高的层次上,您的数据模型是有意义的。但是,你不能保证 admin_user_id 指向 user 在同一家公司。您可以通过执行以下操作来解决此问题:

create table users (
    user_id int auto_increment primary key,
    company_id int,
    name varchar(255),
    unique (company_id, user_id)  -- redundant but desirable for the foreign key reference
);

create table companies (
    company_id int auto_increment primary key,
    name varchar(255),
    admin_user_id int,
    foreign key (company_id, admin_user_id) references users(company_id, user_id)
);

alter table users
    add constraint fk_users_company_id
        foreign key (company_id) references companies (company_id);

相关问题