我需要在关系数据库(MySQL)中对人员数据库进行建模。
每个人都有财产。有些属性确实只有 1:1 关系(例如性别男性/女性),而其他属性确实具有 1:n 关系,例如运动或语言(例如,一个人可能会打篮球和足球,会说英语和德语)。另外,这些 1:n 关系具有技能水平(例如专业、初学者)。
目前我在问自己是否有比 EAV 模型更好的方法来模拟人-属性关系。我关心的主要是让具有特殊属性的人更容易过滤(例如,所有男性演员(专业打篮球或是初学者)并且会说专业的英语。应该可以轻松添加新属性(而这必须不一定是完全动态的)。如果这需要由开发人员完成并且需要更改表是可以的。但应该不难(例如修改sql语句,添加连接,添加数据库表/查找表) .
我会采用经典的基于列的设计,将 person 表中的 1:1 属性放在每个属性的单独列中。我不确定在这样的设计中,哪一种是建模 1:n 关系的最佳方式。我想避免为每个 1:n 属性查找和单独的表。
最好的方法似乎仍然是以下 EAV 方法:
具有列 id、name 的 Persons 表,例如
1 | 基督教
具有列 person_id、property、value、level 的 Properties 表,例如:
1 | 性别 | 男| 1 | 运动 | 篮球 | 专业的 1 | 运动 | 足球 | 初学者 1 | 语言 | 英语 | 专业的 1 | 语言 | 德语 | 基本的