代码之家  ›  专栏  ›  技术社区  ›  Aillyn

具有额外属性的记录:稀疏表还是EAV?

  •  2
  • Aillyn  · 技术社区  · 15 年前

    我有一个模型,已经有几十列,将填补大部分时间。现在我需要添加可能每次都不同的字段。

    最好的方法是什么?我不喜欢EAV模式。我也不喜欢有一个稀疏表的想法,特别是考虑到这些额外的属性可能会有很大的不同。

    例子:

    WorkOrder:
    PK id
    FK assigned_to
    FK contractor
    DATE expected_completion
    DATE actual_completion
    ... (many more)
    

    现在我想添加如下属性:

    ep_1 (extra_property)
    ep_2
    ep_3
    ep_4
    ... (many more)
    

    这些额外的属性在不同的记录中可能会有很大的不同,而且大多数情况下它们的数量是有限的,但是没有保证。

    将记录视为:

    id  |  assigned_to  | contractor  | ... | ep_1   | ep_2  | ep_3 | ... | ep_n
    1   |  2            | 3           | ... | XYZ    | NULL  | NULL | ... | 23
    2   |  3            | 5           | ... | NULL   | 1     | NULL | ... | NULL
    3   |  2            | 1           | ... | NULL   | 0     | NULL | ... | NULL
    4   |  4            | 1           | ... | XYZ    | NUL   | NULL | ... | 45
    

    SELECT fields FROM table WHERE ep_n > 20 SELECT fields FROM table WHERE ep_1='ABC'

    最好的解决办法是什么?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Stephen Drew    10 年前

    什么数据库?以SQL Server为例,您可以考虑使用 Sparse Columns 对稀疏表进行了优化。对于EAV建模,我建议阅读SQL Server客户顾问团队的白皮书: Best Practices for Semantic Data Modeling for Performance and Scalability