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*
这在理论上是可行的,但我想避免两个问题:
和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就我而言,它是一种设备