我正在尝试为我的项目完成我的数据模型设计,并且很难找出使用它的方法。
我有一个用户表,以及适用于该用户的未确定数量的属性。几乎在每种情况下,属性都是可选的,因此允许使用空值。这些属性中的每一个都是用户的一对一。我应该将它们放在同一个表上,并在添加属性时继续添加列(使用户表非常宽),或者我应该将每个属性放在带有用户表的外键的单独表中。
我决定不使用EAV模型。
谢谢!
修改
属性包括婚姻状况,性别,年龄,名字和姓氏,职业等。所有都是可选的。
答案 0 :(得分:3)
表:
USER_PREFERENCES
是一个多对多表,用于连接USERS
和USER_PREFERENCE_TYPE_CODES
表。这将允许您规范化首选项类型属性,同时仍然可以灵活地添加首选项而无需ALTER TABLE语句。
答案 1 :(得分:2)
您能举例说明您想要添加到用户表的属性类型吗?只要你保持在大约50列以下,这应该不是什么大问题。
然而,一种方法是分割数据:
用户名,hashed_password,last_login,last_ip,current_ip等的一个表(用户),display_name,birth_day等的另一个表(个人资料)
您可以通过相同的id属性链接它们,也可以将user_id列添加到其他表中。
答案 2 :(得分:2)
这取决于。
您需要查看具有该属性的用户百分比。如果属性为'WalkedOnTheMoon',则将其拆分,如果是'Sex'将其包含在用户的表中。还要考虑基表上的列数,少数,10-20,不会伤害那么多。
如果您有多个相关属性,可以将它们分组到一个公共表中:'MedicalSchoolId','MedicalSpeciality','ResidencyHospitalId'等可以组合在UserMedical表中。
答案 3 :(得分:2)
就个人而言,我会决定是否存在自然的属性分组。您可以将最常见的查询放在用户表中,将其他查询放在一个具有一对一关系的单独表中,以防止表太宽(我们通常称之为User_Extended)。如果某些属性属于自然分组,则它们可能会调用单独的表,因为这些属性通常会一起查询。
在查看属性时,检查一些属性是否可以组合成一列(例如,如果用户不能同时处理三个不同的事情(比如实习生,常驻人员,参加者),但一次只有一个,那就更好了有一个字段并将数据放入其中而不是三个必须被转换的字段。如果您需要使用包含所有三个文件的case语句来获取所需的信息(比如标题),则尤其如此。换句话说,查看你的属性,看看它们是否真的是分开的,或者它们是否可以被抽象为更一般的属性。