【问题标题】:Authorisation System Database Design [closed]授权系统数据库设计
【发布时间】:2015-10-26 01:19:26
【问题描述】:

我正在为 CMS 开发授权系统。我有以下表结构: 所有其他表对我来说都可以,但我想知道最佳实践 对于 GroupPermission 表,如下所述。

用户:
用户名,姓名

组: 组 ID、名称

组用户:
GroupUserId,GroupId,UserId

模块:
模块ID,名称

权限:
PermissionId,Name,ModuleId,isAllowed

方法 1:
GroupPermission:

GPId GroupId ModuleId 权限(var char) 1 1 1 查看:真,创建:假,删除:真,编辑:假 2 1 2 视图:ture,inviceCreate:假,AssignCreate:假

方法 2:
GroupPermission:

GPId GroupId PermissionId
1 1 1
2 1 2
3 1 3

我需要你对提到的两种方法的建议,在第一种方法中,一个优点是只为特定组返回一行,但我在字符串中连接权限,所以会有字符串解析方法的开销, 在第二种方法中,我使用“Id”而不是字符串。

由于此表是使用最多的表,会影响应用程序的整体性能,因此需要最大限度地优化此表。

我研究了其他 Cms 的数据库,如 word press、orchard、silver stripe 等,但他们只有很少的用户和组表,找不到任何对我的要求有用的东西。

非常感谢任何其他替代建议或想法。

【问题讨论】:

  • 如果有人能告诉我被否决的原因会很好

标签: sql-server database database-design relational-database database-schema


【解决方案1】:

采用第二种标准化方法。
在 99.999% 的情况下,将分隔数据保留在单列中是错误的。
考虑到字符串操作开销,否则每个组权限只有一行不是优势,否则就是文件选择、插入、更新和删除。

花点时间想想如果有人想从组中删除权限:你必须弄清楚组是否甚至有这个权限,然后找出它的文本开始和结束的位置,剪切它出完整的字符串,然后才更新记录。
而使用规范化版本,您所要做的就是编写一个简单的删除语句......

【讨论】:

  • 首先感谢,至少有些人回应了一些建议,而不是无缘无故地投反对票。我也有一个观点,我不应该使用连接字符串,但是如果数据会返回多行而不是一行,你怎么看。
  • 你的前辈完全错了。我建议您尝试解释归一化方法更好。如果必须,请创建一个演示数据库。在他们不相信的情况下,要么顺其自然,要么使用方法。 1,或者找一份更好的工作。
  • 是的,你是对的,第一种方法也很难实现,需要额外的解析方法,从长远来看,它会让人头疼,我要实现第二种。谢谢跨度>
  • 顺便说一句,如果一个答案解决了你的问题,你应该接受它,这样其他人就会知道问题已经解决了。
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2014-10-23
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多