Bac*_*cko 7 ruby mysql sql ruby-on-rails ruby-on-rails-3
我正在使用Ruby on Rails 3.2.2和MySQL.我想知道在类的数据库表中存储与其实例的每个" 组合 "的两个其他类相关的所有记录是"可取的"/"可取的" .
也就是说,我有User和Article模特.为了存储所有用户文章授权对象,我想实现一个ArticleUserAuthorization模型,以便给定N个用户和M个文章有N*M个ArticleUserAuthorization记录.
这样,我可以说明并使用ActiveRecord::Associations如下:
class Article < ActiveRecord::Base
has_many :user_authorizations, :class_name => 'ArticleUserAuthorization'
has_many :users, :through => :user_authorizations
end
class User < ActiveRecord::Base
has_many :article_authorizations, :class_name => 'ArticleUserAuthorization'
has_many :articles, :through => :article_authorizations
end
Run Code Online (Sandbox Code Playgroud)
但是,上述存储所有组合的方法将导致一个包含数十亿数十亿行的大型数据库表!此外,理想情况下,我计划在创建一个或一个对象时创建所有授权记录(也就是说,我计划一次创建所有先前提到的" 组合 ",或者更好地,以"延迟"批次创建...无论如何,这个过程会创建其他数十亿的数据库表行!!!)并在销毁时做出反之亦然(通过删除数十亿数据库表行!!!).此外,我计划在更新或更新对象时立即读取和更新这些行.UserArticleUserArticle
所以,我的怀疑是:
注意:我会使用这种方法,因为,为了在检索或对象时只检索"授权对象" ,我认为我需要"原子"用户授权规则(即每个用户和文章对象的一个用户授权记录),因为系统不是基于"admin","registered"等用户组.因此,我认为表的可用性避免了运行与用户授权相关的方法(注意:这些方法涉及一些可能会使性能恶化的MySQL查询 - 请参阅我之前关于每个检索到的对象的示例"授权"方法实现的问题)通过"简单地"访问/加入表,以便仅检索"用户授权的"对象.UserArticleArticleUserAuthorizationArticleUserAuthorization
事实上,如果你想要每个用户的文章级权限,那么你需要一种方法来将Users与Article他们可以访问的s 相关联.这需要最低限度你需要N*A(其中A是唯一许可文章的数量).
正如你所建议的那样,3NF的方法是UsersArticles设置一个......这是一个非常大的表(如你所说).
考虑一下这个表会被访问很多......在我看来,这似乎是一种稍微非规范化的方法(甚至是noSQL)更合适的情况之一.
考虑Twitter用于其用户关注者表的模型:
这些作品中的一个样本是在Twitter上学到的一个教训,即从标准化表格中查询关注者会给桌子带来巨大的压力Users.他们的解决方案是对关注者进行非规范化处理,以便将用户的关注者存储在他们各自的用户设置中.
非规范化很多.一手救了他们.例如,它们将所有用户ID朋友ID存储在一起,这阻止了大量昂贵的连接. - 避免复杂的连接. - 避免扫描大量数据.
我想可以使用类似的方法来提供文章权限并避免使用非常紧张的UsersArticles单个表.
您不必重新发明轮子.ACL(访问控制列表)框架现在处理相同类型的问题,如果你问我,效率最高.您有资源(文章)或更好的资源组(文章类别/标签/等).另一方面,您有用户(用户)和用户组.然后,您将拥有一个相对较小的表,将资源组映射到用户组.并且您将拥有另一个相对较小的表,该表保存此常规映射的异常.或者,您可以使用规则集来满足访问文章的要求.您甚至可以拥有动态组,例如:authors_friends,具体取决于您的用户 - 用户关系.
只需看看任何体面的ACL框架,您就会知道如何处理这类问题.
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |