我有一个项目,要求我设置自定义权限,分为三个类别"管理员,经理,用户" 我的常规方法是在一个表中将权限分配为标题,然后为每个类别添加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
我的问题,为了我的理智...哪个更有效率?他的观点是,如果我们需要添加新权限,我们不需要更改表格来添加新列。 希望这个问题有道理。
答案 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 !!!