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

时间:2010-08-15 02:58:57

标签: sql database-design entity-attribute-value sparse-matrix

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

什么是最好的方法?我不喜欢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 > 20SELECT fields FROM table WHERE ep_1='ABC'

之类的查询

最佳解决方案是什么?

1 个答案:

答案 0 :(得分:3)

什么数据库?例如,对于SQL Server,您可以考虑使用针对稀疏表优化的Sparse Columns。对于EAV建模,我建议您阅读SQL Server客户顾问团队关于该主题的白皮书:Best Practices for Semantic Data Modeling for Performance and Scalability。许多建议也适用于其他供应商,不是特定于SQL Server的。