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

use*_*149 1 mysql database-design

我在MySQL中创建了一个表,我希望在这些元素之间建立联系.

它应该是一个多对多的关系,我想出的是以下内容:

  • 创建一个包含以下元素的表:

    表医学

    | id | 名字| 描述|

  • 创建一个包含以下链接的表:

    表不兼容

    | medicine_id_1 | medicine_id_2 |

因此,当我想在药物1和药物2之间创建不相容时,我应该这样做:

INSERT INTO incompatibilities VALUES 1,2
Run Code Online (Sandbox Code Playgroud)

当我想要检索所有与药物ID = 1不相容的药物时,我应该这样做:

SELECT * FROM incompatibilities WHERE medicine_id_1=1 OR medicine_id_2=1
Run Code Online (Sandbox Code Playgroud)

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

先感谢您

Qua*_*noi 5

由于不兼容性是一种对称的反射关系,因此您应该始终按顺序存储药物:ID最小的药物,medicine_id_1最大ID 的药物medicine_id_2.

您应该创建唯一索引:

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)
Run Code Online (Sandbox Code Playgroud)

,插入值:

INSERT
INTO    incompatibility (medicine_id_1, medicine_id_2)
VALUES   (LEAST(@med1, @med2), GREATEST(@med1, @med2))
Run Code Online (Sandbox Code Playgroud)

这样,您可以在单个记录中以两种方式存储关系,并且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
Run Code Online (Sandbox Code Playgroud)