首页 > 解决方案 > 在数据库中使用循环外键引用

问题描述

我有两个(mysql)表 -companyuser. 它们的结构如下:

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

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

user外键指向company表,反之亦然。

我想知道上面的模式是否可以,如果不是为什么不可以,可以做些什么来改进它。

标签: mysqlsqldatabasedatabase-design

解决方案


在高层次上,您的数据模型是有意义的。但是,您不能保证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);

推荐阅读