表行或列

时间:2018-05-27 16:36:40

标签: mysql sql

我有一个项目,要求我设置自定义权限,分为三个类别"管理员,经理,用户" 我的常规方法是在一个表中将权限分配为标题,然后为每个类别添加0或1的原始数据,以激活或停用组的权限,如下所示:

id|name|can_do_this|can_do_that
1|admin|1|1
2|manager|1|0
3|user|0|0

但是我的教授要求每个用户不分别添加每个权限,如下所示:

id|user_id|privilege|active
1,1,can_do_this,1
2,1,can_do_that,1
3,2,can_do_this,1
4,2,can_do_that,0

我的问题,为了我的理智...哪个更有效率?他的观点是,如果我们需要添加新权限,我们不需要更改表格来添加新列。 希望这个问题有道理。

3 个答案:

答案 0 :(得分:6)

对我来说,这是一个非常简单的数据建模问题。你有两个"实体"在您的数据模型中:

  • 用户
  • 权限

这表明每个人都应该拥有自己的桌子。

因为这是多对多关系(许多用户可以拥有给定的权限,一个用户可以拥有许多权限),第三个表通常用于表达关系;这通常被称为"交联表"或"关联表"。

你的教授给出了一个非常好的理由来表达行而不是列中的值:添加新权限的能力。

我可以添加更多:

  • userPrivileges表可以有createdOn列,以便您知道权限何时生效。
  • userPrivileges可以有createdBy列,因此您知道授予该权限的人。
  • userPrivileges表可以有suspended列,因此您可以暂时暂停权限。

答案 1 :(得分:1)

我会建议你第二个,因为你的老师说你不需要改变桌子。更改表将意味着为表中的每个成员添加新的1或0(您可以使用默认值,但仍需要更改那些需要该权限的用户的值)。

您的老师说您可以拥有具有所有权限的另一个表,并使用外键。

通过这种方式,您可以添加一个新权限并将其设置为他们需要的用户,默认值为" 1",如果您需要撤销该权限,则将其更改为" 0&#34 ;.默认情况下不会添加innecesari行,在小表中不是问题,但对于较大的表,它是。

id  |user_id   |privilege   |active
1      1        can_do_this    1
2      1        can_do_that    1
3      2        can_do_this    1
4      2        can_do_that    0

答案 2 :(得分:0)

根据我的经验,如果您不希望每当需要在应用中更新新权限时添加额外列。然后选择第二个选项。

优点: 选项-1:组中没有冗余数据,可以轻松管理,因为您可以对组名应用唯一约束,因此每次都不需要插入。

选项-2:您不需要添加表格,只需验证是否已经存在新权限,如果没有,则只需添加新插入或更新现有权限。

重氮基优点: 选项-1:每当有新的权限进入时,您都需要更改表格。

选项-2:每当您想要首先添加组的新权限时,您必须确定记录是否已存在,然后您必须插入表中。虽然与第一个选项相比,验证它也有点复杂。

因此,两者都有其优点和缺点。如果您从数据冗余角度考虑,那么请使用选项-1,否则请使用选项-2。

根据我的知识,我更愿意使用选项-1,我会做的只是维护一个额外的表格来识别它们之间的权限和物理列,我将使它成为通用的。

ThatsAll !!!