我有一個問題,我不知道如何正確解決。我目前的設計由兩個表格組成。員工和employee_management。我的RDBMS是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 |
+------------+-------------+
返回的行表明Bill Smith管理Bob Smith,Bob Smith管理Bill Smith,我認爲這是一個循環引用。兩個人互相管理沒有意義。我認爲UNIQUE INDEX會阻止插入具有任何現有值組合的行,但這不起作用。我知道我可以防止這種情況發生在應用程序級別,但我不確定這是否是適當的事情,但這是必須在應用程序級別執行的事情,還是我可以做的事情防止循環引用?管理者不應該也有管理者。
鮑勃史密斯可以管理管理鮑勃史密斯的比爾史密斯的迪克瓊斯嗎? – Strawberry
經理沒有經理。 –
在這種情況下,請考慮切換到嵌套集模型 - 或者像您說的那樣,在應用程序級別管理業務邏輯 – Strawberry