我在MySQL中创建了一个表,我希望在这些元素之间建立联系。
它应该是一个多对多的关系,我想出的是以下内容:
创建一个包含以下元素的表:
表医学| id |名字|说明|
创建一个包含链接的表:
表不兼容
| medicine_id_1 | medicine_id_2 |
因此,当我想在药物1和药物2之间产生不相容时,我应该这样做:
INSERT INTO incompatibilities VALUES 1,2
当我想要检索所有与药物ID = 1不相容的药物时,我应该这样做:
SELECT * FROM incompatibilities WHERE medicine_id_1=1 OR medicine_id_2=1
这是正确的方法吗?这些查询是否按预期工作?有没有更有效的方法来做我想要的事情?
提前谢谢
答案 0 :(得分:5)
由于不兼容性是对称的反身关系,因此您应始终按顺序存储药物:medicine_id_1
中id最小的药品,medicine_id_2
中ID最大的药品。
您应该创建唯一索引:
CREATE UNIQUE INDEX ux_incompatibility_1_2 ON (medicine_id_1, medicine_id_2)
CREATE UNIQUE INDEX ux_incompatibility_2_1 ON (medicine_id_2, medicine_id_1)
,插入值:
INSERT
INTO incompatibility (medicine_id_1, medicine_id_2)
VALUES (LEAST(@med1, @med2), GREATEST(@med1, @med2))
这样,您可以在单个记录中以两种方式存储关系,UNIQUE
约束可以正常工作。
选择所有不相容的药物:
SELECT CASE 1 WHEN medicine_id_1 THEN medicine_id_2 ELSE medicine_id_1 END
FROM incompatibility
WHERE medicine_id_1 = 1
OR medicine_id_2 = 1