【问题标题】:Design of the database with multiple user roles多用户角色数据库设计
【发布时间】:2015-02-21 22:04:54
【问题描述】:

我们中的许多人可能都遇到过这种情况。我想构建一个支持多个用户角色并且不想在该过程中使用 gems 的应用程序。

我有 4 类用户:

Admin
Teacher
Student
Librarian

Admin 很简单,他只需要两列,usernamepassword。开头的用户表只包含这些值:

username, password, admin, teacher, student, librarian

admin, teacher, student, librarian 是定义用户是否具有特定角色的布尔值。管理员将admin 设置为true 并将所有其他列设置为false。

当我们引入仅特定于一个角色的其他列时,问题就出现了。我们有这些用于用户表的列:

id
username
password
admin
teacher
student
librarian
teacher_column1
teacher_column2
teacher_column3
student_column1
student_column2
student_column3
etc...

创建用户时,我们需要用空值填充很多列。如果我们创建一个教师,所有只有图书管理员和学生才需要的列都用空值填充。

当人们问到这个问题时,有几个地方建议他们进行性传播感染,所以他们会以这样的方式结束:

class User < ActiveRecord::Base

end

class Admin < User

end

class Teacher < User

end

class Student < User

end

这看起来好多了,但仍然会引入很多空值。

其他想法是为不同的用户类型详细信息引入 4 个新表。像这样的:

用户表:

id
username
password
admin
teacher
student
librarian

教师桌:

user_id
teacher_column1
teacher_column2
teacher_column3

学生桌:

user_id
username
password
student_column1
student_column2
student_column3

图书管理员和管理员也是如此。在我们检查角色后创建用户的过程中,将在特定表中为该用户创建新行。

您如何看待最后一种方法?优缺点?

这是创建具有多个用户角色的系统的正确方法吗?谢谢。

【问题讨论】:

标签: sql ruby-on-rails ruby-on-rails-4 database-design


【解决方案1】:

不要为每个权限使用不同的列。

为包含这些列的用户创建一个表:

username
password
user_type

user_type 将是%w{admin teacher student librarian} 中的一个值,然后像您在帖子中提到的那样使用单表继承。

为角色创建一个表:

name

然后创建一个表来将角色与用户联系起来:

role_id
user_id

为权限创建一个表:

name

然后创建一个表来将权限绑定到角色:

permission_id
role_id

最终你将拥有:

  • 3 个带表格的模型:UserRolePermission

  • 4 个没有表的模型,继承自 UserAdminTeacherStudentLibrarian

  • 2 个没有模型的表:users_rolesroles_permissions

另外,如果每个用户类型都有很多列是唯一的,那么我建议为每个用户类型使用不同的模型+表,并使 Role 中的 user 具有多态性。

这样您就可以轻松创建新角色/权限、修改特定角色的权限以及轻松添加/删除特定用户的角色。

【讨论】:

  • 感谢您的建议。这部分我还不清楚:4 models without tables, inherting from User。您建议将所有这些额外的列保留在 users 表中,并在与创建的用户无关的列中保留大量 null 值?就我而言,我将拥有一个包含 20 列的 users 表。
猜你喜欢
  • 2021-12-23
  • 2017-10-06
  • 2016-03-30
  • 2012-03-08
  • 2017-05-24
  • 2014-11-26
  • 2017-01-04
  • 2020-10-24
相关资源
最近更新 更多