[英]Design of the database with multiple user roles
我们许多人可能都遇到过这种情况。 我想构建一个支持多个用户角色的应用程序,并且不想在该过程中使用gems。
我有4种类型的用户:
Admin
Teacher
Student
Librarian
Admin
很简单,他只需要两列, username
和password
。 开头的用户表仅包含以下值:
username, password, admin, teacher, student, librarian
列admin, teacher, student, librarian
是布尔值,它们定义用户是否具有特定角色。 Admin将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
图书馆员和管理员也一样。 在我们检查角色后的用户创建过程中,将在该用户的特定表中创建新行。
您如何看待最后一种方法? 缺点和优点?
这是创建具有多个用户角色的系统的正确方法吗? 谢谢。
请勿为每个权限使用不同的列。
使用以下列为用户创建一个表:
username
password
user_type
user_type
将是%w{admin teacher student librarian}
一个值,然后像您在帖子中提到的那样使用单表继承。
创建角色表:
name
然后创建一个表以将角色绑定到用户:
role_id
user_id
为权限创建表:
name
然后创建一个表以将权限绑定到角色:
permission_id
role_id
最后,您将获得:
3个带表的模型: User
, Role
和Permission
4种不带表的模型,由User
继承: Admin
, Teacher
, Student
和Librarian
2个没有模型的表: users_roles
和roles_permissions
另外,如果每种用户类型都有很多唯一的列,那么我建议为每个用户使用不同的模型+表,并使user
处于“ Role
多态”状态。
这样,您可以轻松创建新角色/权限,修改特定角色的权限以及轻松添加/删除特定用户的角色。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.