我有一个存储职位空缺的现有数据库设计。
“空缺”表在所有客户中都有许多固定字段,例如“职位”、“描述”、“工资范围”。
客户可以自行设置“自定义”字段的 EAV 设计,例如“经理姓名”、“工作时间”。字段名称存储在“ClientText”表中,数据存储在带有 VacancyId、ClientTextId 和 Value 的“VacancyClientText”表中。
最后,有一个多对多的 EAV 设计,用于自定义标记/对空缺进行分类,例如空缺所在的位置/办公室、所需技能列表。这存储为“ClientCategory”表,列出标签的类型、“Locations、Skills”、“ClientCategoryItem”表,列出每个类别的有效值,例如,“London,Paris,New York,Rome”、“C#、 VB、PHP、Python”。最后有一个“VacancyClientCategoryItem”表,其中包含空缺的每个选定项目的 VacancyId 和 ClientCategoryItemId。
客户可以添加的自定义字段或自定义类别的数量没有限制。
我现在正在设计一个与现有系统非常相似的新系统,但是,我有能力限制客户可以拥有的自定义字段的数量,并且它是从头开始构建的,因此我没有要处理的遗留问题。
对于自定义字段,我的解决方案很简单,我在空缺表上有 5 个额外的列,称为 CustomField1-5。这删除了 EAV 设计之一。
我正在努力使用标记/分类设计。如果我将客户限制为 5 个类别/类型的标签。我是否应该创建 5 个表列出可能的值“CustomCategoryItems1-5”,然后再创建 5 个多对多表“VacancyCustomCategoryItem1-5”
这将导致 10 个表执行与现有系统中的三个表相同的存储。
此外,如果(天堂禁止)需求发生变化,我需要 6 个自定义类别而不是 5 个,那么这将导致大量代码更改。
因此,任何人都可以建议任何更适合存储此类数据的数据库设计模式。我很高兴坚持使用 EAV 方法,但是,现有系统遇到了与这种设计相关的所有常见性能问题和复杂查询。
非常感谢任何意见/建议。
使用的 DBMS 系统是 SQL Server 2005,但是,如果任何特定模式需要,2008 是一个选项。