我有两个(mysql)表-- company 以及 user . 它们的结构如下:
company
user
`user` - id - company_id (FK to company) - name `company` - id - name - admin_user_id (FK to user)
这个 user 表的外键 company 表,反之亦然。我在想,如果上面的模式是好的,如果不是为什么它不是,可以做些什么来改善它。
ujv3wf0j1#
如果它是您业务领域的准确表示,那么这才是真正重要的。然而,sql中可能存在一个问题。sql只允许一次更新一个表,所以公司或用户必须排在第一位。通常,当您插入一个没有相应用户的新公司时,或者插入一个没有相应公司的新用户时,您必须允许临时打破约束。要实现这一点,可以使其中一个外键为空,也可以暂时禁用约束。有些数据建模者不喜欢循环依赖关系,即使在纯粹的概念模型中,sql的限制是不相关的。在我看来,有些人会将循环依赖性视为建模错误。不赞成循环依赖似乎与er建模特别相关。有趣的是,循环自引用依赖在对象角色建模中被认为是理所当然的,甚至有一个特殊的表示法(环约束)。
wvt8vs2t2#
在较高的层次上,您的数据模型是有意义的。但是,你不能保证 admin_user_id 指向 user 在同一家公司。您可以通过执行以下操作来解决此问题:
admin_user_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);
2条答案
按热度按时间ujv3wf0j1#
如果它是您业务领域的准确表示,那么这才是真正重要的。然而,sql中可能存在一个问题。sql只允许一次更新一个表,所以公司或用户必须排在第一位。通常,当您插入一个没有相应用户的新公司时,或者插入一个没有相应公司的新用户时,您必须允许临时打破约束。要实现这一点,可以使其中一个外键为空,也可以暂时禁用约束。
有些数据建模者不喜欢循环依赖关系,即使在纯粹的概念模型中,sql的限制是不相关的。在我看来,有些人会将循环依赖性视为建模错误。不赞成循环依赖似乎与er建模特别相关。有趣的是,循环自引用依赖在对象角色建模中被认为是理所当然的,甚至有一个特殊的表示法(环约束)。
wvt8vs2t2#
在较高的层次上,您的数据模型是有意义的。但是,你不能保证
admin_user_id
指向user
在同一家公司。您可以通过执行以下操作来解决此问题: