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

时间:2018-10-25 19:38:39

标签: mysql sql database database-design

我有两个(mysql)表-If (Input.GetKeyDown(KeyCode.Space)) { switch (CAMERA_STATE) { case MAIN: MainCamera.enabled = false; FrontCamera.enabled = true; break; case FRONT: FrontCamera.enabled = false; LeftCamera.enabled = true; break; case LEFT: LeftCamera.enabled = false; RightCamera.enabled = true; break; case RIGHT: RightCamera.enabled = false; BackCamera.enabled = true; break; case BACK: BackCamera.enabled = false; MainCamera.enabled = true; break; default: break; } } company。它们的结构如下:

user

`user` - id - company_id (FK to company) - name `company` - id - name - admin_user_id (FK to user) 表的user表外键,反之亦然。

我想知道上面的模式是否还可以,如果这不是为什么不可行,可以采取什么措施来改善它。

2 个答案:

答案 0 :(得分:2)

从总体上讲,您的数据模型很有意义。但是,您不能保证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);

答案 1 :(得分:2)

如果它是您的业务领域的准确代表,那才是真正重要的。但是,SQL中可能存在问题。 SQL只允许一次更新一个表,因此公司或用户必须先更新。通常,当您插入没有相应用户的新公司时,或者插入没有相应公司的新用户时,您必须允许临时打破约束。为此,您可以使外键之一为空,或者可以暂时禁用约束。

某些数据建模者不喜欢循环依赖,即使在纯概念模型中,SQL的限制都不相关。少数人会将循环依赖视为建模错误-我认为是错误的。循环依存关系的拒绝似乎与ER建模特别相关。有趣的是,在对象角色建模中,循环自引用依赖关系是理所当然的,甚至对它们都有特殊的表示法(环形约束)。