Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在数据库中使用循环FK引用_Mysql_Sql_Database_Database Design - Fatal编程技术网

Mysql 在数据库中使用循环FK引用

Mysql 在数据库中使用循环FK引用,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我有两个(mysql)表--company和user。它们的结构如下: `user` - id - company_id (FK to company) - name `company` - id - name - admin_user_id (FK to user) 用户表外键指向公司表,反之亦然 我想知道上面的模式是否正确,如果不是,为什么不正确,可以做些什么来改进它。从高层次上讲,您的数据模型是有意义的。但是,您不能保证admin\u user\u id指向同一公司的用户。您可以通过执

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

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

`company`
- id
- name
- admin_user_id (FK to user)
用户
表外键指向
公司
表,反之亦然


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

从高层次上讲,您的数据模型是有意义的。但是,您不能保证
admin\u user\u id
指向同一公司的
用户。您可以通过执行以下操作来解决此问题:

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);

从高层次上讲,您的数据模型是有意义的。但是,您不能保证
admin\u user\u id
指向同一公司的
用户。您可以通过执行以下操作来解决此问题:

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);

如果它是您的业务领域的准确表示,那么这才是真正重要的。然而,SQL中可能存在一个问题。SQL只允许一次更新一个表,所以公司或用户必须首先更新。通常,在插入没有相应用户的新公司时,或者插入没有相应公司的新用户时,必须允许临时打破约束。要实现这一点,可以使其中一个外键为空,也可以临时禁用约束


有些数据建模者不喜欢循环依赖关系,即使是在SQL的局限性无关紧要的纯概念模型中也是如此。一些人会将循环依赖性视为一个建模错误——在我看来是错误的。不赞成循环依赖性似乎与ER建模特别相关。有趣的是,循环自引用依赖关系在对象角色建模中被认为是理所当然的,甚至有一个特殊的符号(环约束)。

如果它是业务领域的准确表示,那么这才是真正重要的。然而,SQL中可能存在一个问题。SQL只允许一次更新一个表,所以公司或用户必须首先更新。通常,在插入没有相应用户的新公司时,或者插入没有相应公司的新用户时,必须允许临时打破约束。要实现这一点,可以使其中一个外键为空,也可以临时禁用约束


有些数据建模者不喜欢循环依赖关系,即使是在SQL的局限性无关紧要的纯概念模型中也是如此。一些人会将循环依赖性视为一个建模错误——在我看来是错误的。不赞成循环依赖性似乎与ER建模特别相关。有趣的是,在对象角色建模中,循环自引用依赖关系被认为是理所当然的,它甚至有一个特殊的符号(环约束)。

您可以将公司表的复合FK(管理用户id,id)定义为用户表的(id,公司id)。这将确保用户表中的“管理员用户”具有与公司表的管理员用户id中定义的相同的公司id。这将确保数据安全integrity@MadhurBhaiya这在概念上是有意义的,但你能在一个答案中说明这一点吗?也许是为了说明如何做到这一点?Gordon Linoff的答案与我在这里的建议基本相同。你可以将company表的复合FK(admin_user_id,id)定义为user表的(id,company_id)。这将确保用户表中的“管理员用户”具有与公司表的管理员用户id中定义的相同的公司id。这将确保数据安全integrity@MadhurBhaiya这在概念上是有道理的,但你能在一个答案中说明这一点吗?也许是为了说明如何做到这一点?戈登·林诺夫的答案与我在这里的建议基本相同。谢谢,是的,这就是我目前的实际情况。在上面,您不仅明确定义了FK,而且还定义了如何添加FK,这也是一个很大的帮助谢谢,是的,这就是我目前实际拥有的。在上面,您不仅明确定义了FK,而且还明确定义了如何添加FK,这也是一个很大的帮助。在有些人希望做不同的事情的情况下,他们将如何做不同的事情?他们会为
CompanyAdmin
或类似的东西单独设置一个表吗?如果有些人希望做不同的事情,他们会如何做不同的事情?他们会为
CompanyAdmin
或类似的东西单独设置一个表吗?