Использование циклических ссылок FK в базе данных - PullRequest
0 голосов
/ 25 октября 2018

У меня есть две (mysql) таблицы - company и user.Они структурированы следующим образом:

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

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

Внешние ключи таблицы user для таблицы company и наоборот.

Мне было интересно, подходит ли вышеуказанный шаблон, иесли это не то, почему это не так, что можно сделать, чтобы улучшить его.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Если это точное представление вашего бизнеса, то это то, что действительно имеет значение.Однако в SQL возможна проблема.SQL позволяет обновлять только одну таблицу за раз, поэтому на первом месте должна стоять либо компания, либо пользователь.Обычно необходимо разрешить временное нарушение ограничения, либо при вставке новой компании без соответствующего пользователя, либо при добавлении нового пользователя без соответствующей компании.Для этого вы можете сделать один из внешних ключей обнуляемым или временно отключить ограничение.

Некоторым разработчикам данных не нравятся циклические зависимости, даже в чисто концептуальных моделях, где ограничения SQL не имеют значения.Некоторые люди воспримут круговые зависимости как ошибку моделирования - на мой взгляд, ошибочно.Отклонение круговых зависимостей, по-видимому, связано именно с моделированием ER.Интересно, что циклические самореференциальные зависимости принимаются как должное в моделировании ролей объектов, в котором даже есть специальная запись для них (кольцевые ограничения).

0 голосов
/ 25 октября 2018

На высоком уровне ваша модель данных имеет смысл.Однако у вас нет гарантии, что 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...