具有多个用户角色的数据库设计

use*_*126 2 sql database-design ruby-on-rails ruby-on-rails-4

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

我有4种类型的用户:

Admin
Teacher
Student
Librarian
Run Code Online (Sandbox Code Playgroud)

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

username, password, admin, teacher, student, librarian
Run Code Online (Sandbox Code Playgroud)

admin, teacher, student, librarian是布尔值,用于定义用户是否具有特定角色。管理员必须admintrue所有其他列设置为false。

当我们引入其他仅针对一个角色的列时,就会出现问题。我们为用户表提供了以下列:

id
username
password
admin
teacher
student
librarian
teacher_column1
teacher_column2
teacher_column3
student_column1
student_column2
student_column3
etc...
Run Code Online (Sandbox Code Playgroud)

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

在人们问这个问题的几个地方,建议他们做性传播感染,这样他们就可以像这样结束:

class User < ActiveRecord::Base

end

class Admin < User

end

class Teacher < User

end

class Student < User

end
Run Code Online (Sandbox Code Playgroud)

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

另一个想法是针对不同的用户类型详细信息引入4个新表。像这样:

用户表:

id
username
password
admin
teacher
student
librarian
Run Code Online (Sandbox Code Playgroud)

老师桌:

user_id
teacher_column1
teacher_column2
teacher_column3
Run Code Online (Sandbox Code Playgroud)

学生桌:

user_id
username
password
student_column1
student_column2
student_column3
Run Code Online (Sandbox Code Playgroud)

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

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

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

SHS*_*SHS 5

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

使用以下列为用户创建一个表:

username
password
user_type
Run Code Online (Sandbox Code Playgroud)

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

创建角色表:

name
Run Code Online (Sandbox Code Playgroud)

然后创建一个表以将角色绑定到用户:

role_id
user_id
Run Code Online (Sandbox Code Playgroud)

为权限创建表:

name
Run Code Online (Sandbox Code Playgroud)

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

permission_id
role_id
Run Code Online (Sandbox Code Playgroud)

最后,您将获得:

  • 3种型号表:UserRole,和Permission

  • 4款不表,从inherting UserAdminTeacherStudent,和Librarian

  • 2个没有模型的桌子:users_rolesroles_permissions

另外,如果每种用户类型都有许多唯一的列,那么我建议为每个用户使用不同的model + tables,并使userin 成为Role多态。

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