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