2016-12-26 52 views
2

我有越来越多的机器,每个连接到不同类型的设备,可以做不同的事情,我试图建立某种排队系统。我到目前为止的第一个想法是使用存储可用机器的数据库表machines,从中我可以根据指定的功能选择所需的机器。所以表将是这个样子:经常需要交集时存储多对多SQL关系的正确方法?

machineId machineName status equipment1 equipment2 network1 network2 1 Test FREE 0 1 1 0

当代码必须的参数列表,并执行代码,寻找他们。例如执行SELECT * FROM Machines WHERE equipment2=1 AND network1=1 AND network2=0 AND status LIKE 'FREE'

这个工作在理论,但有两个问题我想避免:

  1. 每个字段需要在代码中定义,添加一个新列,以及时
  2. 某些字段是互斥。 IE我不希望连接到网络2的计算机在某些情况下运行某些测试,并且某些设备会阻止计算机执行一些基本功能(即使那些不需要的和设备),所以我必须添加该代码具体排除它。例如。以上为AND network2=0

我的下一个想法是使用连接表。所以表将是:

Machines: machineId machineName status

Equipments: equipemntId equipmentName exclusive

然后,我将有一个结表

MachinesEquipments: machineId equipmentId

不过,如果我想其中有equipment2和访问权限的计算机到network1,但无权访问network2(因为它被标记为独占),并且也是FREE,它对我来说太复杂了,知道该怎么做,或者即使它是正确的方式...

这是多对多的正确方法吗?我错过了哪些SQL文件?

+0

“网络”在您的数据模型中存储在哪里? –

+0

@Gordon Linoff就我而言,这是一种设备 – Nescio

回答

1

您的第二个规范化版本是正确的选择。您可以使用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 

处理网络。

相关问题