我需要在Postgres数据库中设计复杂的用户权限时需要帮助。在我的Rails应用程序中,每个用户都可以访问一组独特的功能。换句话说,没有确定用户可以访问哪些功能的预定义“角色”。

在几乎每个 Controller / View 中,该应用程序都会检查当前用户是否有权访问其他功能。理想情况下,该应用程序将提供约100种不同的功能,并支持50万以上的用户。

目前,我正在考虑三个不同的选项(但欢迎选择!),并想知道哪个选项提供了最佳性能。预先感谢您的任何帮助/建议。

选项1:多对多关系

通过在User表和Feature表之间构建多对多关系,该应用程序可以通过查询联接表来检查用户是否有权访问给定功能。

例如,如果联接表中有一条记录将user1和feature1连接起来,则user1可以访问feature1。

选项2:多列

该应用程序可以将每个功能表示为User表上的 bool 值列。这样可以避免查询多个表以检查权限。

例如,如果user1.has_feature1为true,则user1有权访问feature1。

选项3:数组列

该应用程序可以将功能作为字符串存储在User表的(GIN索引?)数组列中。然后,要检查用户是否有权使用功能,它将在数组列中搜索给定的功能。

例如,如果user1.features.include? 'feature1'为true,则user1有权访问feature1。

最佳答案

多对多关系是这里唯一可行的选择。他们将其称为关系数据库是有原因的。

为什么?

  • 连接实际上并不那么昂贵。
  • 多列-表中的列数将是ludicris,这将是真正的开发人员 hell 。由于每个功能都增加了迁移,因此代码库中的客户流失数量将非常可观。
  • 数组列-使用数组列似乎是一种有吸引力的选择,直到您意识到与将内容填充到逗号分隔的字符串中相比,实际上这只是一个很小的改进。您没有参照完整性,并且拥有代表应用程序中实体的模型也不会带来代码组织的好处。
    哦,每当要取消某个功能时,您都必须更新这500k +用户中的每一个。 VS仅使用CASCADE。

  • class Feature
      has_many :user_features
      has_many :users, through: :user_features
    end
    
    class UserFeature
      belongs_to :user
      belongs_to :feature
    end
    
    class User
      has_many :user_features
      has_many :features, through: :user_features
    
      def has_feature?(name)
        features.exist?(name: name)
      end
    end
    

    关于ruby-on-rails - Postgres : Many-to-many vs.多列与数组列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43690430/

    10-12 05:16