我需要帮助在Postgres数据库中设计复杂的用户权限。在我的Rails应用程序中,每个用户都可以访问唯一的功能集。换句话说,没有预定义的"角色"确定用户可以访问的功能。
在几乎每个控制器/视图中,应用程序都会检查当前用户是否可以访问不同的功能。理想情况下,该应用程序将提供约100种不同的功能,并将支持500k +用户。
目前,我正在考虑三种不同的选择(但欢迎替代品!),并想知道哪种选择提供最佳性能。 提前感谢您提供任何帮助/建议。
通过在User
表和Feature
表之间构建多对多关系,应用程序可以通过查询连接表来检查用户是否可以访问给定功能。
例如,如果连接表中有连接 user1 和 feature1 的记录,那么 user1 可以访问 feature1
该应用可以将每个功能表示为User
表上的布尔列。这样可以避免查询多个表以检查权限。
例如,如果user1.has_feature1
为真,则 user1 可以访问 feature1 。
应用程序可以在User
表的(GIN-indexed?)数组列中将功能存储为字符串。然后,要检查用户是否有权访问某个功能,它会在数组列中搜索给定的功能。
例如,如果user1.features.include? 'feature1'
为真,则 user1 可以访问 feature1 。
答案 0 :(得分:4)
多对多关系是这里唯一可行的选择。他们称之为关系数据库是有原因的。
为什么呢?
"errmsg" : "E11000 duplicate key error collection: users.users index: username_1 dup key: { : null }"