用户类型的数据库规范化

本文关键字:规范化 数据库 类型 用户 | 更新日期: 2023-09-27 17:59:37

我正在尝试设计一个用户数据库来满足多个用户的需求。每种类型的用户都有不同的个人资料需要填写,例如,企业用户将有一个网站字段、企业名称,而普通用户将有出生数据、家庭地址。

他们还将共享一些共同点,如活动、注册日期、名字。从面向对象的方法来看,我将有一个共同的基础,然后从基础继承以形成单独的配置文件。但从数据库设计的角度来看,这应该如何实现?如果我们有一个通用的userProfile表,那么businessProfile。用户类型会随着时间的推移而增长,因此重复相同字段的问题可能会很烦人,但拥有一个完全规范化的数据库可能会导致连接速度缓慢。

有人能帮我吗?

用户类型的数据库规范化

我会选择一个包含所有人的主表和几个只包含该类型用户的专用(1到0或1)表:

AllUsers
    UserID          int identity PK
    Active          char(1)?
    DateRegistered  date
    FirstName       {string}
    ..all other common columns here
BusinessUsers
    UserID    int PK and FK to AllUsers
    Website   {string}
    ..all business only columns
NormalUsers
    UserID    int PK and FK to AllUsers
    BirthDate date
    ..all normal user only columns
..any other user types tables as needed

如果您需要为用户加载所有内容,请执行以下操作:

SELECT
    * --please only return the columns you actually need!
    FROM AllUsers                     u
        LEFT OUTER JOIN BusinessUsers b ON u.UserID=b.UserID
        LEFT OUTER JOIN NormalUsers   n ON u.UserID=n.UserID
    WHERE u.UserID=123

如果您只需要加载特定类型的数据,请使用:

SELECT
    * --please only return the columns you actually need!
    FROM AllUsers                     u
        LEFT OUTER JOIN NormalUsers   n ON u.UserID=n.UserID
    WHERE u.UserID=123
--or
SELECT
    * --please only return the columns you actually need!
    FROM NormalUsers   n
    WHERE n.UserID=123

我个人会使用配置文件表(按逻辑组组织,或者一个表开始,但说真的,它可能会变宽),然后在一个单独的元数据层中处理"哪个配置文件需要哪些字段"。