关系系统数据的MySQL数据库模式

时间:2015-07-03 05:38:50

标签: mysql database schema

我们假设有系统。系统包含子系统。子系统包含设备。设备包含测量点。

让我们假设一个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;`

任何替代方案?

提前致谢

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'

然而,这需要大量工作来重新组织您的数据,如果用户可以与维度表有任意数量的关系,那么创建事实表非常困难。