[英]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.