消除铁轨上的Hasmany关系中的联接表
-
21-09-2019 - |
题
我正在考虑在Rails中创建基于角色的访问控制系统的方法。我也看到了这些伟大的项目(等):
我的问题是,真的有必要为所有内容提供一个联接表吗?如果我恋爱中的一张表只有几个值(例如少于100),我不能只是将加入表与该小表合并吗?)这就是我的意思...这就是我需要的:
楷模
- 用户
- 团体
- 角色
- 允许
- 用户/角色
- grouproles
- 会员资格(小组使用者)
- rolepermissions
这样的东西...
道路 RoLerequirement 作品是创建一个 roles
桌子和 roles_users
加入表。这意味着,如果我在应用程序中有20个可能的角色,我有
- 有20行的角色表
- 带有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权限并在权限表中具有coole_id。与组一样,如果我在我的多态列中,我不需要小组角色 roles
桌子。
推荐的方法是什么?
这里有一个 拟议迁移的片段.
解决方案
我不建议你这样做。您所描述的称为 否定化.
译本引入了许多应用程序的问题,只有在您有明确的情况下才能做到 需要 为了它。我通常只为报告目的不规范表。
您的问题并没有表明您有任何符合性的规范化。相反,它表现出对拥有“额外”表的误导性的厌恶,并避免简单的连接。复制数据的成本不仅仅是空间,还要花费性能(唯一不是免费赠品)。现代RDBM非常擅长处理连接。
我建议谷歌搜索和搜索,以了解有关统计化的信息。没有黄金法则,但是您的案子似乎没有任何充分的理由。
如果您正在寻找性能提高,请将ActivereCord扔进垃圾桶。有很多替代方法,您可以写自己的替代品。