如何将不同类型的属性值存储为EAV?

时间:2010-12-17 07:31:13

标签: database-design entity-attribute-value

您能告诉我们如何将不同类型的属性值存储为EAV吗?

我现在看到3个选项。

  1. 要在不同字段的一个表中存储,例如: entity_id attribute_id string_value numberic_value date_value。
  2. 将不同类型属性的值存储在不同的表中,例如string_attribute_values,numeric_attribute_values,date_attribute_values。
  3. 要将所有类型的值存储为VARCHAR,但此变体似乎不合适,因为很难进行过滤,例如,通过数值(它们将被比较为字符串)并且它允许例如在字段中输入字母只有数字应该是。
  4. 我想我现在需要:字符串,数字(整数)和日期类型,但稍后可能会出现其他类型。

    谢谢。

1 个答案:

答案 0 :(得分:1)

在RDBMS社区中,EAV是一个反模式。对于使用EAV获得的“无限灵活性”,将数据重新构建为记录/对象所需的SQL要复杂得多。您还可以获得无法使用任何可用的数据完整性工具(外键,检查约束等)的“好处”。随着时间的推移,此设计会在其自身重量下崩溃。

如果您有一个用例,其中数据元素是超类型/子类型关系的一部分,但它们没有太大变化,那么根据您的需要对表进行建模:

1。)类表继承=具有公共父类的特定子类型表。当超类型和子类型都具有大量独特属性时,这是最好的。

2.)Concrete Table Inheritance =将公共超类型列放在每个子类型的表中。当超类型没有很多自己的属性时,这种方法效果会更好,但是子类型可以。

3.)Single Table Inheritance =将所有子类型的列与超类型列放在一起。与特定行的子类型无关的列具有NULL值。这最适用于每个子类型没有多个唯一属性或多个子类型共享列/属性时。

你可以混合和匹配那些3,但我建议坚持使用其中一种设计。

如果您真的需要使用EAV,如果您的EAV设计中有相对较小比例的数据(与整个数据库相比),则在RDBMS中使用XML列。如果您的大量数据存储在EAV中,那么RDBMS就不是您需要的工具。查看文档/ NoSQL / Key-Value数据库,如MongoDB,Cassandra等。实现EAV的RDBMS,如果不是早期,最终会成为编码的噩梦。

考虑到你的问题日期,我很想知道你选择了哪条路线,你学到了什么,你喜欢/不喜欢什么等等。