MySQL - 链接另一个表中同一个表中的两个元素

时间:2011-01-31 16:32:11

标签: mysql database-design

我在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

这是正确的方法吗?这些查询是否按预期工作?有没有更有效的方法来做我想要的事情?

提前谢谢

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