Mysql 在经常需要交集时存储多对多SQL关系的正确方法?

Mysql 在经常需要交集时存储多对多SQL关系的正确方法?,mysql,sql,many-to-many,Mysql,Sql,Many To Many,我有越来越多的机器,每台都连接到不同类型的设备上,可以做不同的事情,我正试图为此建立某种排队系统。到目前为止,我的第一个想法是使用数据库表machines存储可用的机器,从中我可以根据指定的功能选择所需的机器。所以这张桌子看起来像这样: select m.machineid from machines m join machinesequipment me on me.machineid = m.machineid join equipment e on

我有越来越多的机器,每台都连接到不同类型的设备上,可以做不同的事情,我正试图为此建立某种排队系统。到目前为止,我的第一个想法是使用数据库表
machines
存储可用的机器,从中我可以根据指定的功能选择所需的机器。所以这张桌子看起来像这样:

select m.machineid
from machines m join
     machinesequipment me
     on me.machineid = m.machineid join
     equipment e
     on me.equipmentid = e.equipementid
where m.status = 'free'
group by m.machineid
having sum(e.equipmentname = 'equipment1') > 0 and   -- has "equipment1
       sum(e.equipmentname = 'equipment2') = 0;      -- does not have "equipment2"
machineId machineName状态设备1设备2网络1网络2
1免费测试0 1 0

其中代码将有一个参数列表,并执行代码搜索所有参数。例如,从设备2=1、网络1=1、网络2=0且状态为“自由”的机器执行
SELECT*

这在理论上是可行的,但我想避免两个问题:

  • 在添加新列时,还需要在代码中定义每个字段
  • 有些字段是相互排斥的。也就是说,我不希望连接到网络2的计算机在某些情况下运行某些测试,并且某些设备会阻止机器执行某些基本功能(即使是那些不需要和设备的功能),因此我必须在代码中添加一个特定的排除项。例如,上面的
    和network2=0
  • 我的下一个想法是使用连接表。因此,这些表格将是:

    机器:
    machineId machineName状态

    设备:
    EquipmentID equipmentName独占

    然后我要一张连接表

    机器设备:
    machineId设备ID

    但是,如果我想要一台有
    设备2
    并且可以访问
    网络1
    ,但是不能访问
    网络2
    (因为它被标记为独占),并且也是
    免费的
    ,那么它对我来说太复杂了,我不知道如何做,或者即使它是正确的方法来


    这是多对多的正确方式吗?我缺少哪些SQL片段?

    您的第二个规范化版本是正确的选择。您可以使用
    having
    子句(也可以使用
    where
    子句)解决查询。例如,查询如下所示:

    select m.machineid
    from machines m join
         machinesequipment me
         on me.machineid = m.machineid join
         equipment e
         on me.equipmentid = e.equipementid
    where m.status = 'free'
    group by m.machineid
    having sum(e.equipmentname = 'equipment1') > 0 and   -- has "equipment1
           sum(e.equipmentname = 'equipment2') = 0;      -- does not have "equipment2"
    
    我不知道
    network
    是如何存储在这个模型中的,但包含它可能只是对这个查询的一个简单调整

    对于网络,您可以添加其他条款,例如:

    sum(e.equipmentname = 'network1') > 0
    

    处理网络。

    数据模型中的“网络”存储在哪里?@Gordon Linoff就我而言,它是一种设备