Sql 多用户角色数据库的设计

Sql 多用户角色数据库的设计,sql,ruby-on-rails,ruby-on-rails-4,database-design,Sql,Ruby On Rails,Ruby On Rails 4,Database Design,我们很多人可能都遇到过这种情况。我想构建一个支持多个用户角色的应用程序,但不想在该过程中使用gems 我有4种类型的用户: Admin Teacher Student Librarian Admin很简单,他只需要两列,username和password。开头的用户表仅包含以下值: username, password, admin, teacher, student, librarian 列管理员、教师、学生、图书管理员是布尔值,用于定义用户是否具有特定角色。Admin将把Admin设置为

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

我有4种类型的用户:

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

username, password, 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...
id
username
password
admin
teacher
student
librarian
当用户被创建时,我们需要用空值填充很多列。如果我们创建一个教师,所有只需要图书管理员和学生的列都会被空值填充

在一些地方,当人们问到这一点时,建议他们进行STI,这样他们就可以这样结束:

class User < ActiveRecord::Base

end

class Admin < User

end

class Teacher < User

end

class Student < User

end
教师表:

user_id
teacher_column1
teacher_column2
teacher_column3
学生表:

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

您对最后一种方法有何看法?利与弊


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

不要对每个权限使用不同的列

为具有以下列的用户创建单个表:

username
password
user_type
user\u type
将是
%w{admin teacher student library}
中的一个值,然后使用单表继承,就像您在文章中提到的那样

为角色创建表:

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

role_id
user_id
为权限创建表:

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

permission_id
role_id
最后,您将拥有:

  • 3个带表格的模型:
    用户
    角色
    、权限

  • 4个不带表格的模型,从
    用户
    导入:
    管理员
    教师
    学生
    ,和
    图书管理员

  • 2个没有模型的表:
    用户\角色
    角色\权限

此外,如果每个用户类型都有许多独特的列,那么我建议为每个用户类型使用不同的模型+表,并使
角色中的
用户
具有多态性


通过这种方式,您可以轻松创建新角色/权限,修改特定角色的权限,并轻松添加/删除特定用户的角色。

我不确定您是否见过或是否是我使用最多的角色为什么不使用gems?您可以使用“多表继承”(在Heritage:中实现)以非常灵活的方式轻松解决问题。如果你需要更多的细节,我可以告诉你怎么做。谢谢你的建议。这一部分我仍然不清楚:
4个没有表格的型号,从用户输入。您建议将所有这些额外的列保留在
users
表中,并在与创建的用户无关的列中保留大量
null
值?在我的例子中,我将有一个包含20列的
users
表。