我正在尝试设计一个用户数据库以满足多个用户的需求。每种类型的用户都将有不同的配置文件来填写,例如商业用户将拥有一个网站字段,商业名称,而普通用户将具有例如出生数据,家庭住址。
他们还会分享一些常见的,如活动的,注册日期,名字。从面向对象的approuch我将有一个共同的基础然后从基地继承以形成单独的配置文件。但是从数据库设计中可以看出应该如何实现呢?我们应该有一个共同的userProfile表,然后是businessProfile。用户类型会随着时间的推移而增长,因此一遍又一遍地重复相同字段的问题可能会令人讨厌,但拥有一个完整的规范化数据库可能会导致连接速度变慢。
有人可以帮我这个吗?
答案 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)
我个人会使用配置文件表(按逻辑组进行组织 - 或者一个表开始但严重,它可能很宽)然后在单独的元数据层中处理“哪个配置文件需要哪个字段”。