用户类型的数据库规范化

时间:2014-04-23 08:09:53

标签: c# database database-design

我正在尝试设计一个用户数据库以满足多个用户的需求。每种类型的用户都将有不同的配置文件来填写,例如商业用户将拥有一个网站字段,商业名称,而普通用户将具有例如出生数据,家庭住址。

他们还会分享一些常见的,如活动的,注册日期,名字。从面向对象的approuch我将有一个共同的基础然后从基地继承以形成单独的配置文件。但是从数据库设计中可以看出应该如何实现呢?我们应该有一个共同的userProfile表,然后是businessProfile。用户类型会随着时间的推移而增长,因此一遍又一遍地重复相同字段的问题可能会令人讨厌,但拥有一个完整的规范化数据库可能会导致连接速度变慢。

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

我会选择一个包含所有人的主表和几个仅包含该类型用户的专用(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

答案 1 :(得分:0)

我个人会使用配置文件表(按逻辑组进行组织 - 或者一个表开始但严重,它可能很宽)然后在单独的元数据层中处理“哪个配置文件需要哪个字段”。