0

我正在考虑在 Rails 中创建基于角色的访问控制系统的方法。我也看到了这些伟大的项目(除其他外):

我的问题是,真的有必要为所有内容创建一个连接表吗?如果我关系中的一个表只有几个值(比如小于 100),我不能只将连接表与那个小表合并吗?)这就是我的意思......这就是我需要的:

楷模

  • 用户
  • 团体
  • 角色
  • 允许
  • 用户角色/角色用户
  • 组角色
  • 成员资格(组用户)
  • 角色权限

那样的东西...

RoleRequirement的工作方式是创建一个roles表和一个roles_users连接表。这意味着如果我在一个应用程序中有 20 个可能的角色,我有

  • 20行角色表
  • 包含 n 行的 RolesUsers 表。

这意味着每次我想按角色查找用户时,我都必须加入。不过我想知道,既然应用程序中只有几个角色,为什么不直接替换这个迁移:

create_table "roles", :force => true do |t|
  t.string "name"
end

create_table "roles_users", :id => false, :force => true do |t|
  t.integer "role_id"
  t.integer "user_id"
end

有了这个...

create_table "roles", :force => true do |t|
  t.string "name"
  t.integer "user_id" # or some polymorphic form
end

这会导致重复(例如大量名为“admin”的角色),但是由于空间很便宜,而且我们可以创建一个方法Role.unique来查找所有唯一角色(以摆脱那个 20 行表),为什么人们要创建连接表?

与权限相同:我可能只有 4 个权限开始:create read update delete. 所以我不需要权限表和roles_permissions 表,我可以复制CRUD 权限并在权限表中拥有role_id。与组相同,如果我的表中有多态列,我不需要组角色roles

推荐的方法是什么?

这是建议迁移的片段

4

1 回答 1

2

我不建议你这样做。您所描述的称为非规范化

非规范化会给许多应用程序带来问题,只有在您明确需要时才应该这样做。我通常仅出于报告目的对表进行非规范化处理。

您的问题并未表明您有任何非规范化的需要。相反,它显示了对“额外”表的误导性厌恶,并避免了简单的连接。重复数据的成本不仅仅是空间,它还影响性能(唯一不是免费赠品)。现代 RDBMS 非常擅长处理连接。

我建议在谷歌上搜索和搜索有关非规范化的信息。没有黄金法则,但您的案例似乎没有任何充分的理由。

如果您正在寻找性能提升,请将 ActiveRecord 扔进垃圾箱。有很多选择,你可以自己写。

于 2010-02-20T02:18:09.467 回答