2010-04-17 150 views
2

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

我正在写一个具有4种主要用户类型(管理员,学校,教师,学生)的应用程序。 目前我有这些表中的每一个,但我不知道这是存储用户信息的最佳方式。例如:允许学生下午其他学生很简单(存储发件人和收件人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用户=被意外学生被输入到教师表(既是有USER_ID)

只是想确保我拿到之前数据库正确我走得更远。 谢谢...

回答

0

您必须问自己,如果一个用户必须是这些类型中的一个(并且只有一个),或者它可能有零个或多个这些类型......在后面的例子中至少),你应该将“用户”与“角色”分开。

但这些问题以及其他问题通常是更好的在应用程序的全球设计阶段(定义域对象和它的关系)回答,然后映射到数据库。因此,举例来说,你可以决定用户是具有附加一个/多个角色(用户“有”角色),或者是一个实体和管理是用户的一个子类(管理“是”用户)。

您可能还会关注关系数据库中类继承的常见实现(即使您不是在执行OOP时也是如此,即使您不选择'是'建模),它也会显示possible alternatives。 ..并告诉你,没有普遍正确的方法。

1

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

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

它往往是主观的,但几乎所有的时间我去每个层次结构战略的表。您经常会发现需要查询所有用户或将外键添加到用户表中。

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

+0

感谢您的所有答案的家伙的东西。我认为我会选择层次结构战略。我注意到你们中没有人回答问题的第二部分......我将如何阻止用户作为学生课而被意外输入到“额外的管理信息”表中。 是否有某种方式MySQL可以检查,或者我将不得不在我的web服务中检查? – EMcKenna 2010-04-17 16:58:33

0

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

写像老师或学生特定实体的具体数据,使用单独的表,它们有一个外键的用户表中的用户。

1

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

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

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