【问题标题】:DB Design Pattern - Many to many classification / categorised taggingDB 设计模式 - 多对多分类/分类标记
【发布时间】:2010-06-10 20:49:40
【问题描述】:

我有一个存储职位空缺的现有数据库设计。

“空缺”表在所有客户中都有许多固定字段,例如“职位”、“描述”、“工资范围”。

客户可以自行设置“自定义”字段的 EAV 设计,例如“经理姓名”、“工作时间”。字段名称存储在“ClientText”表中,数据存储在“VacancyClientText”表中,包含 VacancyId、ClientTextId 和 Value。

最后,有一个多对多的 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 个(天堂禁止)需求更改,那么这将导致大量代码更改。


因此,任何人都可以建议任何更适合存储此类数据的 DB 设计模式。我很高兴坚持使用 EAV 方法,但是,现有系统遇到了与这种设计相关的所有常见性能问题和复杂查询。

非常感谢任何意见/建议。

使用的 DBMS 系统是 SQL Server 2005,但是,如果任何特定模式需要,可以选择 2008。

【问题讨论】:

  • 如果我能把问题放在一个小范围内,那么我可能一开始就不会遇到问题。由于这个问题是一个设计问题,不幸的是,获得任何建议的唯一方法是尽可能详细地说明有关需求的信息。
  • 这里的这个问题显示了我在编写查询以返回如此多对多 EAV 模式的结果时遇到的性能问题。这里的回答是“不要这样做”。 stackoverflow.com/questions/2386577/…

标签: sql-server database design-patterns database-design entity-attribute-value


【解决方案1】:

您是否考虑过使用 XML 列?您可以通过 XSL 以声明方式强制执行所有约束。

使用一个包含由架构(或架构集合)验证的 XML 数据的列,而不是 EAV。

【讨论】:

  • 我正在考虑使用 XML。我已经将它用于许多非模式绑定的情况,但从未大量使用它作为 EAV 的替代品。我会对此做一些调查,看看它的“感觉”如何。
【解决方案2】:

看看at this问题/答案;描述观察模式。 它使用五个表,并且可以在“标准”RDBMS 中实现——Sql Server 2005 可以。 实体可以拥有的自定义属性(观察)的数量没有限制。

编辑

如果属性需要标签(类别),请查看at this one

【讨论】:

    【解决方案3】:

    为什么不将自定义字段存储在键值表中?

    | vacancy ID | CustomFieldType | CustomFieldValue |
    

    然后有辅助表列出每种类型的可能值(1 个表),并且可能是每种空缺类型的可能类型(它似乎是原始的 ClientCategory)

    【讨论】:

    • 这是自定义一对一字段上的当前 EAV 方法。我可以通过使它们成为有助于简化和提高性能的固定列来取消 EAV 方法。然而,我正在寻找的选项是多对多的领域。
    • @Robin - 抱歉,我发现这种方法在设计和性能方面都是最好的......当然是你的选择:)
    • 这里的这个问题显示了我在编写查询以返回如此多对多 EAV 模式的结果时遇到的性能问题。这里的回答是“不要这样做”。 stackoverflow.com/questions/2386577/…
    猜你喜欢
    • 2021-06-05
    • 2016-02-13
    • 2018-01-26
    • 2023-04-05
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2015-07-26
    • 2019-04-01
    相关资源
    最近更新 更多