将用户存储在数据库中

时间:2010-04-17 16:12:46

标签: sql mysql database-design

我想知道在我的数据库中存储不同类型用户的最佳方式。

我正在编写一个包含4种主要用户类型(管理员,学校,教师,学生)的应用程序。 目前我有一个表格,但我不确定这是存储用户信息的最佳方式。

例如......允许学生PM其他学生很简单(商店发件人和收件人student_id),但启用PM老师的教师需要另一个表(发件人teacher_id,发件人student_id)。

是否所有用户都存储在一个user_type字段的用户表中?如果是这样,教师/学生的具体信息仍然必须存储在另一个表格中。

users
user_id, password_hash, user_type

students
user_id, student_specific_stuff...

teachers
user_id, teacher_specific_stuff...

如何阻止具有user_type = student的用户被意外输入教师表(因为他们都有user_id)

我想确保在进一步操作之前让数据库正确无误。 感谢...

5 个答案:

答案 0 :(得分:1)

在数据库中存储类层次结构有两种主要策略,每个层次结构策略的表和每个类策略的表。与您建议的一样,在每个层次结构的表中,您需要一个列来区分用户类。

这一切都归结为你是否处理真正不同或具有共同基础的对象。例如,是否存在适用于任何类型用户的操作?

这通常是主观的,但几乎所有的时间我都按照层次结构策略选择表格。您经常需要查询所有用户或将外键添加到用户表。

此外,每个层次结构的表的变体是加入类的子表,例如。您可以添加仅包含教​​师特定列的教师表,并使用与用户表的联接。

答案 1 :(得分:1)

您的主users表应该有一个user_type_id列,用于将用户与其类型相关联。然后,当您插入用户时,您只需确保为其user_type存储了正确的值。

要存储额外数据,您可以在users表中添加一列,称为extra_information_id(或其他内容)。然后,您还可以再增加2个表student_informationteacher_information。插入/更新/选择用户时,您可以使用user_type_id列和extra_information_id列的组合来确定用于特定用户额外信息的2个额外信息表中的哪一个。

答案 2 :(得分:0)

你必须问自己一个用户是否必须是这些类型中的一个(并且只有一个),或者它们可能是零或多于一种类型......在后一种情况下(至少),你应该将“用户”与“角色”分开。

但是,在应用程序的全局设计阶段(定义域对象及其关系)通常会更好地回答这些问题和其他问题,然后映射到数据库。因此,例如,您可以决定用户是附加了一个/多个角色的实体(用户'具有'角色),或者可能是Admin是User的子类(Admin'是'User)。

您可能还会看一下关系数据库中类继承的常见实现(即使您没有表达OOP,即使您不选择'is a'建模),它也会显示{{3 ...并告诉你没有普遍正确的方法。

答案 3 :(得分:0)

对于用户,您将拥有2个表:用户和组。

编写有关特定实体(如教师或学生)的特定数据,在Users表中使用所有具有外键的单独表格。

答案 4 :(得分:0)

使用ORM术语,我通常以下列方式实现身份验证:

user = id, user id/name, password, created datetime, updated datetime, last login datetime

user has many roles

在角色和角色之间使用联接表用户因此用户可以成为教师和管理员,或学生&教师。

角色可以像

一样简单
role = id, role name,

或像MySQL的用户表

这样的矩阵式权限系统
role = id, name, can_write, can_read, etc...