【问题标题】:Storing users in a database在数据库中存储用户
【发布时间】:2010-04-17 16:12:46
【问题描述】:

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

我正在编写一个具有 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)

只是想确保我在继续之前得到正确的数据库。 谢谢...

【问题讨论】:

    标签: sql mysql database-design


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的所有回答。我认为我会采用层次结构策略。我注意到你们都没有回答问题的第二部分......我将如何阻止作为学生班级的用户意外输入到“额外的管理员信息”表中。 MySQL 有什么方法可以检查还是我必须在我的网络服务中进行检查?
    【解决方案2】:

    您的主要users 表应该有一个user_type_id 列,它将用户链接到他们的类型。然后,当您插入用户时,您只需确保为其 user_type 存储正确的值。

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

    【讨论】:

      【解决方案3】:

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

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

      您还可以查看关系数据库中类继承的常见实现(即使您没有明确地执行 OOP,即使您不选择“is a”建模),它会向您展示possible alternatives ...并向您展示没有普遍正确的方法。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          使用 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...
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-25
            • 2012-10-26
            • 1970-01-01
            • 2021-09-05
            • 2011-08-28
            • 2017-05-30
            • 2023-03-31
            相关资源
            最近更新 更多