我们的应用程序中有“用户”和“学习”实体,存储在各自的表中。研究代表了一种研究和收集到的数据。他们之间有着多到多的关系,所以我们需要一个链接表: studies_users。
我们为用户分配角色。有一些“正常”的角色,它们依赖于学习,因此对于同一个用户,他们可以是不同的,取决于所选择的学习。这意味着必须将这些角色存储为studies_users表的一部分。
然而,有一个新的“特殊”角色的请求,让我们称它为超级管理员,这基本上意味着用户在各种研究中都拥有所有可能的角色(或权限)。这意味着这样的属性不必存储在studies_users链接表中,只需将其存储在新列(例如is_superadmin)的users表中就足够了,因为它适用于所有的研究。
但是,如果我将它与其他角色单独存储(在users表中),它似乎有点不合逻辑,并可能导致处理相关逻辑的代码中不必要的复杂性。
我应该将该属性存储在链接表中还是用户表中?为什么?
表的一些非常基本的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`)
);发布于 2015-01-03 23:05:22
如果将DB设计与现实世界联系在一起,“superadmin”是用户的一个属性,在功能上仅由用户决定,因此应该在表用户中。是的,这将给查询增加一些复杂性,但当用户从superadmin更改为“normal”时,您将不会感到头疼;您只需要更改一个标志,您的数据在任何时候都将保持一致。
发布于 2015-01-03 22:47:49
因为您的“超级管理员”角色是一个特殊的角色,而不是您描述的其他角色,所以您不应该感到必须将它们存储在同一个表中。你可以称它们为两种角色,但这并不意味着它们是一回事。
最简单的方法是有一个表来存储属于这个超级管理角色的所有用户的主键。将字段添加到user表意味着在每一行中存储额外的数据(甚至更糟的是NULL),即使只有极少数用户是超级管理员。
https://stackoverflow.com/questions/27760206
复制相似问题