我们将使用一个szenario的EAV模式,其中我们将拥有具有不同属性的各种不同实体。EAV和数据类型
“基本”EAV模式由3个表格组成。由于不同的属性会有不同的数据类型(日期,长,布尔,....)我正在考虑如何解决这个问题。
第一种方法是将所有内容存储为字符串。这需要“解析”并且有一个像'1'这样的数字不会直接显示,如果这是一个double,boolean或任何东西。 属性值表看起来像
id|attribute_id|entity_id|value
1 2 3 17.0
2 4 2 Foobar
其次的方法是分裂的不同类型分为不同的列,具有值列空的,像:
id|attribute_id|entity_id|value_string|value_long|value_float|value_date
1 2 3 NULL NULL 17.0 NULL
2 4 2 Foobar NULL NULL NULL
然而,这会产生大量的空值这基本上是为什么决定导致EAV模式的原因(减少空值在未使用的列)
因此,这导致第三种可能的解决方案,创建类型属性表:
attribute_values_string
id|attribute_id|entity_id|value
2 4 2 Foobar
attribute_values_float
id|attribute_id|entity_id|value
1 2 3 17.0
但是,这将使得查询更复杂,一如既往n
表有蜜蜂检查的attribute_value
的存在。如果全部使用它们自己的auto_increment,那么对于不同的值类型使用它也会导致相同的attribute_ids
。因此,有一个价值被转换为另一种类型可能有点棘手,因为它是id
无法维护。当然,可以通过添加另一个非类型attribute_values
表来提供auto_increment值并可能包含某些类型信息和/或元数据,从而避免这种情况。 (因为我们需要使用版本控制/修订版本,所以我们无法使用自动生成的attribute_values_ids,因为两个版本仍然需要共享相同的ID)
所以,第一个决定是布局。有没有人有使用EAV 的经验?每次尝试的瓶颈是什么?
Thx为您的答案。我们意识到EAV模式的“一般”缺陷,但在我们的案例中,好处是占主导地位。因此,我正在寻找实施它的“最佳”解决方案。目前解决方案2似乎是最好的折衷方案。有空值,是的,但为每种类型添加自己的表格将会增加复杂性,并且如上所述,使属性的“类型转换”更难,而不是使用单个值表。组装一个实体并不是什么大问题(即使修改了attributeValues也是如此)。但是,列出几个实体,因为您只需要为一个实体进行大量加入。 – dognose 2013-04-23 18:48:38