2010-02-20 38 views
0

我在考虑如何在Rails中创建基于角色的访问控制系统。我看到这些伟大的项目太多(其中包括):在Rails中消除HasMany关系中的连接表

我的问题是,是否真的需要有一个连接表为了一切?如果我关系中的一个表只有少数值(比如小于100),我不能只将合并表与该小表合并吗?)这就是我的意思......这就是我需要的:

模型

  • 用户
  • 角色
  • 权限
  • 的UserRole/RolesUsers
  • GroupRoles
  • 成员(GroupUsers)
  • RolePermissions

类似的东西...

的方式RoleRequirement作品是通过创建一个roles表和roles_users连接表。这意味着,如果我在一个应用20个总的可能角色,我有20行

  • RolesUsers表具有n行

    • 角色表。

    这意味着每次我想通过角色找到一个用户,我必须做一个连接。我想知道,不过,因为只会出现在应用程序中几个角色,为什么不直接替换此迁移:

    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 
    

    会导致重复(吨的角色名为“管理”为例),但由于空间很便宜,我们可以创建一个像Role.unique这样的方法来查找所有独特的角色(摆脱那20行表),为什么人们创建连接表?

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

    这样做的建议方法是什么?

    这是snippet of the proposed migration

  • 回答

    2

    我不会建议你这样做。你所描述的是denormalization

    反规范化会给很多应用程序带来问题,只有在您需要明确需要时才会出现问题。为了报告目的,我通常只是将表格归一化。

    你的问题并没有表明你有任何需要非规范化。相反,它显示出对“多余”表的误导,并避免了简单的连接。重复数据的成本不仅仅是空间,还会降低性能(独特不是免费赠品)。现代RDBMS非常善于处理连接。

    我会建议谷歌搜索和搜索SO的反规范化信息。没有金科玉律,但你的情况似乎没有什么好的理由。

    如果您正在寻找性能提升,请将垃圾邮件中的ActiveRecord引发。有很多选择,你可以自己写。

    +0

    非常感谢。刚开始的时候,我读到了非规范化的问题,以及有多少人认为RDBMS比CouchDB更令人讨厌。没有丰富的数据库管理经验,我不知道在如何划分数据以及何时加入成为问题(性能和维护方面)方面有哪些最佳实践。你有没有可靠的资源来缓解我对“有额外表格的厌恶”:)。这将有助于! – 2010-02-20 05:03:08

    +1

    http://www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html – hobodave 2010-02-20 06:19:54