MySQL表(重新)设计

时间:2015-01-03 22:26:45

标签: mysql

我们的应用程序中有“user”和“study”实体,存储在各自的表中。 一项研究代表了一种研究和收集的数据。 他们有多对多的关系,所以我们需要一个链接表:studies_users。

我们为用户分配角色。有一些“正常”角色,这些角色与学习有关,因此对于相同的用户,他们可能会有所不同,具体取决于所选择的研究。这意味着必须将这些角色存储为studies_users表的一部分。

然而,有一个新的“特殊”角色的请求,我们称之为superadmin,这基本上意味着用户在各种研究中都具有所有可能的角色(或权利)。这意味着这样的属性不必存储在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`)
);

2 个答案:

答案 0 :(得分:2)

如果您将数据库设计贴在现实世界中,那么超级拉丁语'是用户的属性,仅由用户在功能上确定,因此应该在表用户中。是的,这会给查询增加一些复杂性,但是当用户从superadmin更改为' normal&#39 ;;您只需要更改一个标志,您的数据就会始终保持一致。

答案 1 :(得分:1)

由于您的“superadmin”角色是一个特殊角色,与您描述的其他角色不同,您不应该被迫将它们一起存储在同一个表中。你可以称他们为两个角色,但这并不意味着他们是同一个角色。

最直接的方法是使用一个表来存储属于此superadmin角色的所有用户的主键。向用户表添加字段意味着在每一行中存储其他数据(甚至更糟,NULL s),即使只有极少数用户是超级用户。