使用多种类型用户的数据库设计

6
我对数据库设计还比较陌生。我正在构建一个小型的asp.net mvc web应用程序,其中有各种类型的用户可以登录网站。
因此,表结构如下:
用户表 userid(主键),用户名,密码,电子邮件,角色等
员工表: Eid(主键),userid(外键),名字,入职日期等
客户表: Cid(主键),userid(外键),名字,公司名称等
用户-员工表和用户-客户表之间存在一对一的关系。
普通用户只有用户表中的详细信息。
这是正确的设计吗?
1个回答

7

如果用户只能是一种类型...

用户 -> 用户类型

用户表将有一个type_id字段,它将是UserTypes表中一个字段的主键。

用户

  • 用户ID 1
  • 姓名 Jonathan Sampson
  • 电子邮件 foo@bar.com
  • 类型ID 1

用户类型

  • id 1
  • type Unregistered

    SELECT users.name, users.email, users.typeid, usertypes.type
    FROM users LEFT JOIN usertypes ON (usertypes.id = users.typeid)
    WHERE (users.id = 1)
    
返回结果:

返回:Jonathan Sampson, foo@bar.com, 1, 未注册

如果用户可以是多种类型...

用户 -> 用户到类型 -> 用户类型

如果一个用户需要具备多种类型的能力,则会引入第三种类型:

用户到类型

  • 用户ID
  • 类型ID

因此,如果一个用户既是type1(客户),又是type2(总统),则在UsersToTypes中将有两条记录:

  • 用户ID(Jonathan Sampson的1个ID)
  • 类型ID(总统的2个ID)
  • 用户ID(1)
  • 类型ID(客户的1个ID)

额外的评论...

我不会将公司名称放在用户/客户表中。如果您在数据库中有许多代表他们的代表,则该名称将存在多次。相反,请创建一个存储以下内容的Companies表:

  • 公司ID
  • 公司名称
  • 联系电话
  • 街道地址
  • 城市
  • 邮政编码

这样,如果公司发生变化,您无需编辑客户表即可更新其名称。您在正确的表中更新其详细信息,然后它们就会全局更新。

当然,如果每个公司都有多个代表,则需要创建一个类似于我们的UsersToTypes的RepsToCompanies表。


1
如果一个用户成为员工或客户,或者两者兼而有之呢?原始设计中这不是问题,但使用显式的user_type_id会造成混乱。 - Steven Sudit
实际上,角色列可以区分不同类型的用户。 - San
员工/客户应该是一张表。我已经更新了我的回答。 - Sampson
但问题在于员工和客户有不同的详细信息需要存储,例如,我们的客户实际上是来自不同公司的人,因此我需要将“公司名称”作为客户表中的一列进行存储。 - San
不是真的。添加一个 company_id 字段并添加一个 companies 表。这样,如果您想要列出与您做生意的公司列表,您就不需要查询用户表。 - Sampson
此外,如果公司名称发生变化,您不希望在客户表中更新300条记录。您只需要在公司表中更新1条记录即可。 - Sampson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接