我的应用程序数据库有一个Groups表,用于将用户分成逻辑角色并定义访问级别(管理员,所有者,销售人员,客户服务等)
群组有很多用户. Users表包含登录详细信息,例如用户名和密码.
现在我希望将用户配置文件添加到我的数据库中.我遇到的麻烦(可能是由于我对正确的数据库规范化的相对不熟悉)是不同的用户组有不同类型的配置文件. Ergo,销售人员的个人资料将包括他的佣金百分比,而管理员或客户服务则不需要此值.
那么,正确的方法是为每个组创建一个唯一的配置文件表吗? (例如admin_profiles或salesperson_profiles).或者是否有更好的方法将通用配置文件中的某些细节组合在一起,而某些用户则具有扩展信息.如果是这样,那么如何通过给出的佣金示例做一个很好的例子呢?
最佳答案 在这样的情况下,这些配置文件是由真实世界的标准真正定义的,我可能建议使用专用于每种类型的表.但是,为了充分披露,您可以使用EAV系统来存储这些内容.类似于:
User:
UserID
...
ProfileID
Profile:
ProfileID
Name
Criteria:
CriteriaID
Name
ProfileCriteria:
ProfileID
CriteriaID
UserCriteria:
UserID
CriteriaID
Profile表定义了配置文件的父表.对于每种配置文件类型,您都有一行.
条件定义了配置文件中可以存在的基本条件,无论哪个配置文件(例如,您可能在多个配置文件上具有相同的条件).
CriteriaProfile用于在Profile和Criteria之间创建m:m关系.这也是您在特定配置文件中添加标准排序等内容的地方.
UserCriteria指向用户对给定条件的特定值.这还允许您切换用户的配置文件,并通过删除那些不属于新配置文件的标准来维护任何常见的标准.
然而
EAV结构需要维护很多开销.您现在必须自己管理,而不是依靠RDBMS的管理结构化数据的设施(这是人们需要付出很多钱).表格往往比非EAV系统快得多,因为你有很多次行数(因为你现在有一行代表普通结构中的每一列).
EAV功能强大且灵活,但并不总是解决方案.如果您的配置文件需要是动态的,那么它们可能是一个合适的工具.