【发布时间】:2015-02-21 22:04:54
【问题描述】:
我们中的许多人可能都遇到过这种情况。我想构建一个支持多个用户角色并且不想在该过程中使用 gems 的应用程序。
我有 4 类用户:
Admin
Teacher
Student
Librarian
Admin 很简单,他只需要两列,username 和 password。开头的用户表只包含这些值:
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
图书管理员和管理员也是如此。在我们检查角色后创建用户的过程中,将在特定表中为该用户创建新行。
您如何看待最后一种方法?优缺点?
这是创建具有多个用户角色的系统的正确方法吗?谢谢。
【问题讨论】:
-
为什么不使用宝石?您可以使用“多表继承”(在 Heritage 中实现:github.com/dipth/Heritage)以非常灵活的方式轻松解决您的问题。如果您需要更多详细信息,我可以向您展示如何完成。
标签: sql ruby-on-rails ruby-on-rails-4 database-design