繁体   English   中英

MySQL表(重新)设计

[英]MySQL table (re)design

我们在应用程序中具有“用户”和“研究”实体,存储在它们各自的表中。 研究代表一种研究和已收集的数据。 它们之间存在多对多关系,因此我们需要一个链接表:study_users。

我们为用户分配角色。 有一些“正常”角色取决于研究,因此对于同一用户,根据所选研究的不同,他们可能会有所不同。 这意味着这些类型的角色必须存储为study_users表的一部分。

但是,需要一个新的“特殊”角色,称之为超级管理员,这基本上意味着该用户在所有研究中都具有所有可能的角色(或权限)。 这意味着不必将属性存储在study_users链接表中,将其存储在users表的新列中就足够了(例如,is_superadmin),因为它适用于所有研究。

但是,如果我将它与其他角色(在用户表中)分开存储,这似乎有点不合逻辑,并且会导致处理相关逻辑的代码中出现不必要的复杂性。

我应该将这种属性存储在链接表还是在用户表中? 为什么?

表的一些非常基本的SQL:

CREATE TABLE `users` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `EMAIL` varchar(100),
  PRIMARY KEY (`ID`)
);

CREATE TABLE `studies` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `NAME` varchar(150),
  PRIMARY KEY (`ID`)
);

CREATE TABLE `studies_users` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `STUDY_ID` int(10),
  `USER_ID` int(10),
  `ROLE_ID` tinyint(3),
  PRIMARY KEY (`ID`)
);

如果您将数据库设计坚持现实,那么“ superadmin”是用户的一个属性,仅在功能上由用户确定,因此应在表user中。 是的,这将增加查询的复杂性,但是当用户从超级管理员更改为“普通”用户时,您会头疼。 您只需要更改一个标志,您的数据将始终保持一致。

由于您的“超级管理员”角色是特殊角色,与您描述的其他角色不同,因此您不应该被迫将它们一起存储在同一张表中。 您可以将它们称为两个角色,但这并不意味着它们是同一回事。

最直接的方法是拥有一个表,该表存储属于该超级管理员角色的所有用户的主键。 向用户表中添加字段意味着即使每小部分用户都是超级管理员,也要在每行中存储其他数据(甚至更糟的是NULL )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM