【问题标题】:database design with many type of users多类型用户的数据库设计
【发布时间】:2009-07-01 20:34:19
【问题描述】:

我对数据库设计很陌生。 我正在构建一个小型 asp.net mvc web 应用程序,其中有各种类型的用户可以登录网站。

所以表结构是,

用户表 userid(PK)、用户名、密码、邮箱、角色等

员工表: Eid(PK)、userid(FK)、名字、加入日期等

客户表: Cid(PK)、userid(FK)、名字、公司名等

用户-员工表之间存在一对一的关系 和用户 - 客户表。

一般用户,只有用户表中的详细信息。

这是一个正确的设计吗?

【问题讨论】:

    标签: database-design


    【解决方案1】:

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

    用户 -> 用户类型

    Users 表会有一个 type_id,它是 UserTypes 表中某个字段的 PK。

    用户

    • 用户 ID 1
    • 姓名乔纳森·桑普森
    • 电子邮件 foo@bar.com
    • typeid 1

    用户类型

    • id 1
    • 类型未注册

      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,未注册

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

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

    如果用户需要拥有不止一种类型的能力,您将引入第三种类型:

    UsersToTypes

    • 用户名
    • 类型标识

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

    • 用户 ID(Jonathan Sampson 的 1 个 ID)
    • typeid(总统 2 个 id)
    • 用户名 (1)
    • typeid(客户 1 个 id)

    额外评论...

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

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

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

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

    【讨论】:

    • 如果用户成为员工或客户,或两者兼而有之怎么办?使用原始设计,这不是问题,但使用显式 user_type_id,这会造成严重破坏。
    • 其实角色栏可以区分不同类型的用户。
    • Employees/Customers 应该是一张桌子。我已经更新了我的答案。
    • 但问题是员工和客户有不同的详细信息要存储,例如。我们的客户实际上是来自不同公司的人,所以我需要将“CompanyName”存储为客户表中的一列。
    • 并非如此。添加一个 company_id 字段并添加一个公司表。这样一来,如果您想要一份与您有业务往来的公司的列表,就无需查询您的 users 表。
    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多