У меня есть проблема, что я не уверен, как правильно ее решить. Мой текущий проект состоит из двух таблиц. сотрудника и сотрудника_management. Моя СУБД - это MySQL.Конструкция реляционной таблицы: предотвращать циркулярные ссылки
сотрудник:
CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
employee_management:
CREATE TABLE `employee_management` (
`manager_id` int(11) NOT NULL,
`employee_id` int(11) NOT NULL,
UNIQUE INDEX `association` (`manager_id`,`employee_id`),
FOREIGN KEY (`manager_id`)
REFERENCES employee(id)
ON UPDATE CASCADE ON DELETE RESTRICT,
FOREIGN KEY (`employee_id`)
REFERENCES employee(id)
ON UPDATE CASCADE ON DELETE RESTRICT
)
Тестовые данные:
INSERT INTO employee(name) VALUES(
'Bob Smith'
)
INSERT INTO employee(name) VALUES(
'Bill Smith'
)
INSERT INTO employee_management(manager_id, employee_id) VALUES(
1,2
)
INSERT INTO employee_management(manager_id, employee_id) VALUES(
2,1
)
Выбор строки из employee_management показывает это:
+------------+-------------+
| manager_id | employee_id |
+------------+-------------+
| 2 | 1 |
| 1 | 2 |
+------------+-------------+
Возвращенные строки указывают, что Билл Смит управляет Бобом Смитом, а Боб Смит управляет Биллом Смитом, который, я считаю, является круглой ссылкой. Два человека, управляющих друг другом, не имеют смысла. Я думал, что UNIQUE INDEX будет препятствовать вставке строк, которые имели бы существующее сочетание значений, но это не сработало. Я знаю, что могу предотвратить это на уровне приложений, но я не уверен, что это подходящая вещь, но это то, что должно быть применено на уровне приложения, или есть что-то, что я могу сделать для предотвратить циркулярную ссылку? Менеджеры также не должны иметь менеджеров.
Может ли Боб Смит управлять Диком Джонсом, который управляет Биллом Смитом, который управляет Бобом Смитом? – Strawberry
Менеджеры не имеют менеджеров. –
В этом случае рассмотрим возможность переключения на модель вложенного набора - или, как вы говорите, управлять бизнес-логикой на уровне приложения. – Strawberry