如何规范化不同用户组具有不同类型的配置文件的数据库?

时间:2010-06-14 15:04:19

标签: database database-design normalization

我的应用程序数据库有一个Groups表,用于将用户分成逻辑角色并定义访问级别(管理员,所有者,销售人员,客户服务等)

群组有很多用户。 Users表包含登录详细信息,例如用户名和密码。

现在我希望将用户配置文件添加到我的数据库中。我遇到的麻烦(可能是由于我对正确的数据库规范化的相对不熟悉)是不同的用户组有不同类型的配置文件。 Ergo,销售人员的个人资料将包括他的佣金百分比,而管理员或客户服务则不需要此值。

那么,正确的方法是为每个组创建一个唯一的配置文件表吗? (例如admin_profiles或salesperson_profiles)。或者是否有更好的方法将通用配置文件中的某些细节组合在一起,而某些用户则具有扩展信息。如果是这样,那么如何通过给出的佣金示例做一个很好的例子呢?

6 个答案:

答案 0 :(得分:2)

那取决于个人资料信息的差异程度。在我们的案例中,与其他用户相比,销售人员拥有的信息更多。我们需要知道他们所处的领土,销售队伍或力量,他们所代表的品牌等。

如果你只有两个不同的数据,只需添加列并使它们可以为空。如果您有大量额外数据,则需要销售人员数据副表的其他组。根据数据的性质,这些表格具有一对一关系或一对多关系。

但请保留适用于所有地方的一般资料信息。最终,您可能拥有多个角色的用户(销售人员和管理员),因此您只希望将基本用户信息存储一次。

答案 1 :(得分:0)

如果您的团队不会长期改变,我建议为每个组的每个配置文件保留单独的表 - admin_profile,salesperson_profile。以所有这些配置文件类型在User对象本身中可用的方式设计对象模型。

修改

如果您的对象模型是合理的,那么您可以执行以下操作。

使用来自USer和Groups表的外部引用创建表USerProfiles。添加两个coloumns,ProfileFieldName和ProfileFieldValue。还要添加主键字段。在运行时,在适用的情况下,继续为每对Group和User添加ProfileFieldName和Values。最重要的是,在对象模型的User对象中,提供与ProfileFieldName相关的类型属性。

我仍然建议以前一种方式执行此操作,因为这样做会花费更多查询和更多处理周期。构建用户对象需要相对更多的时间和处理。

答案 2 :(得分:0)

最好的方法可能是拥有一个表admin_profiles,一个表salesperson_profiles,等等。每个表都应该有一个引用基本“Users”表的外键,并且适用于所有(或大多数)类型用户的任何属性都应该是“Users”表中的列。

我假设将修复不同角色的列表,即系统用户不必添加新的任意类型的角色。如果是这种情况,你可能会在EAV领域,我理解这不是很有趣。

答案 3 :(得分:0)

其他供应商使用的另一个选项是只有2个表。其中一个列出了定义配置文件的属性,例如磁盘空间,返回的行数等。其他列出哪些组具有该选项。 Oracle做了非常相似的事情。

这允许比其他方法更容易扩展,但是限制了如何向结构添加新的名称 - 值对。例如,如果名称 - 值对中有3个元素,则可能遇到麻烦。但我认为这是一种更简单,更清洁,更具可扩展性和更简单的方法。

答案 4 :(得分:0)

您最好的选择是使用user_meta表来存储用户的ID,元名称(佣金或您想要存储的其他值)以及元值。

这样,您可以添加和删除字段,而无需更改数据库,您也不必继续查看不同的表。

所以你可以拥有

 user_id | meta_name  | meta_value
 10      | commission | 1.5%
 50      | CS rating  | 85%

用户#10是销售人员,用户#50是客户服务代表。

答案 5 :(得分:0)

在这样的情况下,这些配置文件是由真实世界的标准真正定义的,我建议使用专用于每种类型的表。但是,为了充分披露,您可以使用EAV系统来存储这些内容。类似于:

User:
    UserID
    ...
    ProfileID

Profile:
    ProfileID
    Name

Criteria:
    CriteriaID
    Name

ProfileCriteria:
    ProfileID
    CriteriaID

UserCriteria:
    UserID
    CriteriaID

Profile表定义了配置文件的父表。对于每种配置文件类型,您都有一行。

Criteria定义了配置文件中可以存在的基本条件,无论哪个配置文件(例如,您可能在多个配置文件上具有相同的条件)。

CriteriaProfile用于在ProfileCriteria之间创建m:m关系。这也是您添加诸如在特定配置文件中对条件进行排序等内容的地方。

UserCriteria指向用户针对给定条件的特定值。这还允许您切换用户的配置文件,并通过删除那些不属于新配置文件的标准来维护任何常用标准。

<强>无论其

EAV结构需要维护很多开销。您现在必须自己管理,而不是依靠RDBMS的管理结构化数据的设施(这是人们需要付出很多钱)。表格往往比非EAV系统快得多,因为你有很多次行数(因为你现在有一行代表普通结构中的每一列)。

EAV功能强大且灵活,但并不总是解决方案。如果您的配置文件需要是动态的,那么它们可能是一个合适的工具。