【发布时间】:2017-04-29 00:03:04
【问题描述】:
我需要帮助在 Postgres 数据库中设计复杂的用户权限。在我的 Rails 应用程序中,每个用户都可以访问一组独特的功能。换句话说,没有预先定义的“角色”来确定用户可以访问哪些功能。
几乎在每个控制器/视图中,应用都会检查当前用户是否可以访问不同的功能。理想情况下,该应用将提供约 100 种不同的功能,并支持 50 万以上的用户。
目前,我正在考虑三种不同的选项(但欢迎使用其他选项!)并且想知道哪个选项提供最佳性能。 提前感谢您的任何帮助/建议。
选项 1:多对多关系
通过在User 表和Feature 表之间构建多对多关系,该应用可以通过查询连接表来检查用户是否有权访问给定功能。
例如,如果连接表中有一条记录连接 user1 和 feature1,则 user1 可以访问 feature1 .
选项 2:多列
应用程序可以将每个功能表示为 User 表上的布尔列。这样可以避免查询多个表来检查权限。
例如,如果 user1.has_feature1 为真,则 user1 有权访问 feature1。
选项 3:数组列
该应用可以将特征作为字符串存储在User 表的(GIN 索引?)数组列中。然后,为了检查用户是否可以访问某个功能,它会在数组列中搜索给定的功能。
例如,如果 user1.features.include? 'feature1' 为真,则 user1 有权访问 feature1。
【问题讨论】:
-
我很想使用多对多 (#1) 作为事实来源(即管理用户特征关联的所有管理表单),然后非规范化(通过回调? ) 到用户 (#3) 的数组列,当该用户登录时,您只需检查数组的访问权限。我认为您可以对该列使用 rails
serialize :features, Array,在数据库级别没有什么特别需要的,因为您从未真正查询过该列。 -
since you never actually query that column似乎是一个错误的假设。