gpt4 book ai didi

ruby-on-rails - Postgres : Many-to-many vs. 多列与数组列

转载 作者:行者123 更新时间:2023-11-29 11:21:46 25 4
gpt4 key购买 nike

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

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

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

选项 1:多对多关系

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

例如,如果连接表中有一条记录连接 user1feature1,则 user1 可以访问 feature1 .

选项 2:多列

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

例如,如果 user1.has_feature1 为真,则 user1 可以访问 feature1

选项3:数组列

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

例如,如果 user1.features.include? “feature1” 为真,则 user1 可以访问 feature1

最佳答案

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

为什么?

  • 加入实际上并不那么昂贵。
  • 多列 - 表格中的列数将是可笑的,这将是真正的开发人员 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com