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很简单,他只需要两列,username和password。开头的用户表仅包含以下值:
username, password, admin, teacher, student, librarian
Run Code Online (Sandbox Code Playgroud)
列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...
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)
图书馆员和管理员也一样。在我们检查角色后的用户创建过程中,将在该用户的特定表中创建新行。
您如何看待最后一种方法?缺点和优点?
这是创建具有多个用户角色的系统的正确方法吗?谢谢。
请勿为每个权限使用不同的列。
使用以下列为用户创建一个表:
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种型号表:User,Role,和Permission
4款不表,从inherting User:Admin,Teacher,Student,和Librarian
2个没有模型的桌子:users_roles和roles_permissions
另外,如果每种用户类型都有许多唯一的列,那么我建议为每个用户使用不同的model + tables,并使userin 成为Role多态。
这样,您可以轻松创建新角色/权限,修改特定角色的权限以及轻松添加/删除特定用户的角色。