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

标签 mysql database schema

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

让我们假设一个 Web 界面/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)
);

(此处未显示 permittedsubsystems、permitteddevices 和 permittedmspoints)

获取用户系统的一个示例查询是

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;`

还有其他选择吗?

提前致谢

最佳答案

通常,当您拥有零到多的关系时,例如用户与设备,您在另一个表中表示这些关系,每个表都有外键。所以你会有一个用户 ID 和设备 ID 的表。你可以查询这张表

选择 * 来自用户设备 左连接设备 ON device.did = UserDevices.did 其中 UserID = '1'

这是在您的架构中表示 1 到多或零到多基数的经典方法。

您的数据集也适合 OLAP 方法。使用星型模式,您可以创建一个表,其中包含用户 ID 以及与该用户关联的所有设备、系统等 ID。然后,您可以将事实表与任意数量的维度表连接起来,通过限制 where 和 on 子句中查询集的大小来提高性能。如果您可以在连接之前先减小表的大小,那么将多个表连接在一起的性能开销会小得多。

选择 * 来自事实表 左连接系统 ON System.did = fact_table.did 左连接装置 ON Device.did = fact_table.did --等等 其中 fact_table.UserID = '1'

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

关于关系系统数据的 MySQL 数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31199253/

相关文章:

mysql - 获得包括并列在内的前 N ​​个结果

mysql - 如何使用关系代数从数据库中获取冗余一致(重复)数据?

ruby-on-rails - 如何回滚特定迁移?

xml - 向位于 XML 架构中多个子元素内的元素添加唯一 id

mysql - 更改密码散列(单向加密)功能

mysql - 如何使用 JOINS 使用 Distinct/group by 过滤行内的重复项

mysql - 连接具有共同重复键的字段并删除那些重复的字段,留下一个

database - 严格的可序列化和外部一致性之间的区别

c# - 带有 DatabaseGeneratedOption.Identity Guid Id 的 EF6 实体强制插入我的 Id 值

database - Firebird数据库模式/数据差异工具