【问题标题】:Eliminate the Join Table in HasMany Relationships in Rails在 Rails 中消除 HasMany 关系中的连接表
【发布时间】:2010-02-20 01:09:05
【问题描述】:

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

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

模型

  • 用户
  • 组
  • 角色
  • 权限
  • UserRoles/RolesUsers
  • 组角色
  • 成员(组用户)
  • 角色权限

类似的...

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。与 Group 相同,如果我的 roles 表中有多态列,则不需要 Group Roles。

推荐的方法是什么?

这是snippet of the proposed migration。

【问题讨论】:

    标签: mysql ruby-on-rails join has-many-through


    【解决方案1】:

    我不建议你这样做。您所描述的称为denormalization。

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

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

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

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

    【讨论】:

    • 非常感谢。刚开始时,我阅读了大量关于非规范化的内容,以及有多少人讨厌 RDBMS 而不是说 CouchDB。由于没有丰富的数据库管理经验,我不知道如何划分数据以及何时加入成为问题(性能和维护方面)的最佳实践。你有什么可靠的资源来缓解我的“厌恶有额外的桌子”:)。这会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多