【问题标题】:How to store values of attributes of different type as EAV?如何将不同类型的属性值存储为 EAV?
【发布时间】:2011-05-26 23:52:06
【问题描述】:

您能告诉我如何将不同类型的属性值存储为 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,但这种变体似乎不合适,因为很难进行过滤,例如,通过数值(它们将作为字符串进行比较),例如,让我们在字段中输入字母应该只有数字。

我想我现在需要:字符串、数字(整数)和日期类型,但以后可能会出现其他类型。

谢谢。

【问题讨论】:

  • 选项 3 在排序方面也会给您带来问题,更不用说必须将每个值从 varchar 转换为正确类型的性能损失。我们正在尝试我们的第一个 EAV 设计,我们将采用选项 2
  • 我也尝试使用选项 2。

标签: database-design entity-attribute-value


【解决方案1】:

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

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

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

2.) 具体表继承 = 将公共超类型列放置在每个子类型的表中。当超类型没有很多自己的属性但子类型有很多属性时,这会更好。

3.) 单表继承 = 将所有子类型的列与超类型的列一起放在 1 个表中。不属于特定行的子类型的列具有 NULL 值。当每个子类型没有很多唯一属性或多个子类型共享列/属性时,这最有效。

你可以混合搭配这 3 种,但我建议坚持使用其中一种设计。

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

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

【讨论】:

  • 类表、具体表和单表继承不适用于我的情况。使用 XML 也是反模式(即使有 1 个 NF,也存在数据完整性和搜索问题)。现在我尝试在这个系统中使用 EAV 作为其中的一小部分。为了存储 EAV 的值,对不同类型使用不同的表:用于字符串、日期、数字。当然,EAV 也会引起一些困难,但坦率地说,我现在看不到替代方案。我查看了一个 mongodb、couchdb 并没有发现它对我的情况有很大帮助。
  • 感谢您的关注。在 RDBMS 中对 EAV 的使用越有限,从长远来看,您的情况就越好。关键是睁大眼睛进入它。还可以查看本页右侧相关列表中的一些帖子。有很多意见。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多