我们假设有系统。系统包含子系统。子系统包含设备。设备包含测量点。
让我们假设一个Webinterface / get / systems,其中返回与用户相关的所有系统。
现在让我们说用户可以在系统上拥有自己的可见性。因此,当用户A获得他的系统时,它是基于可见性权限的另一组 - 而不是用户B获得的。
架构
CREATE TABLE system(
sid INT NOT NULL AUTO_INCREMENT,
cid INT NOT NULL,
PRIMARY KEY(sid)
);
CREATE TABLE subsystem(
subsid INT NOT NULL AUTO_INCREMENT,
sid INT NOT NULL,
PRIMARY KEY(subsid)
);
CREATE TABLE device(
did INT NOT NULL AUTO_INCREMENT,
subsid INT NOT NULL,
PRIMARY KEY(did)
);
CREATE TABLE mspot(
mid INT NOT NULL AUTO_INCREMENT,
did INT NOT NULL,
PRIMARY KEY(mid)
);
对于一整套系统,子系统,设备和测量点,它是这些表中的连接。如果它应扩展到可见性,那么什么是可行的方法?
第一个镜头是创建一个像
这样的表格CREATE TABLE permittedsystems (
sid INT NOT NULL,
uid INT NOT NULL,
PRIMARY KEY(sid, uid)
);
(允许的子系统,允许的设备和允许的点在这里没有显示)
获取用户系统的一个示例查询是
SELECT * FROM customer
JOIN
user ON customer.cid = user.cid
JOIN
system ON system.cid = customer.cid
LEFT JOIN
subsystem ON system.sid = subsystem.sid
LEFT JOIN
device ON device.subsid=subsystem.subsid
LEFT JOIN
mspot ON mspot.did = device.did
JOIN
permittedsystems ON permittedsystems.uid = user.uid
AND
permittedsystems.sid = system.sid
JOIN
permittedsubsystems ON permittedsubsystems.uid = user.uid
AND
permittedsubsystems.subsid = subsystem.subsid
JOIN
permitteddevices ON permitteddevices.uid = user.uid
AND
permitteddevices.did = device.did
JOIN
permittedmspots ON permittedmspots.uid = user.uid
AND
permittedmspots.mid = mspot.mid
WHERE
user.uid = 1;`
任何替代方案?
提前致谢
答案 0 :(得分:1)
通常,当您具有零到多关系时,例如具有设备的用户,您可以在另一个表中使用外键来表示这些关系。因此,您将拥有一个用户ID和设备ID表。您可以查询此表
选择* 来自UserDevices LEFT JOIN设备 ON device.did = UserDevices.did 用户ID =' 1'
这是在模式中表示1对多或零到多基数的经典方法。
您的数据集也可以很好地适应OLAP方法。使用星型模式,您可以创建一个包含用户ID的表以及与该用户关联的所有设备,系统和ect ID。然后,您可以将事实表与任意数量的维度表连接,通过限制where和on子句中查询集的大小来提高性能。如果您可以在加入表之前先减小表的大小,那么将大量表连接在一起的性能要低得多。
选择* 来自fact_table 左加入系统 ON System.did = fact_table.did 左加入设备 在Device.did = fact_table.did上 --ect 其中fact_table.UserID =' 1'
然而,这需要大量工作来重新组织您的数据,如果用户可以与维度表有任意数量的关系,那么创建事实表非常困难。