我需要在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。
最佳答案
多对多关系是这里唯一可行的选择。他们将其称为关系数据库是有原因的。
为什么?
哦,每当要取消某个功能时,您都必须更新这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/