mysql - EAV 和数据类型

标签 mysql entity-attribute-value

我们将在场景中使用 EAV 模式,其中我们将拥有具有截然不同属性的各种不同实体。

“基本”EAV 模式由 3 个表组成。由于不同的属性有不同的数据类型(日期、长整型、 bool 型……),我目前正在考虑如何解决这个问题。

第一种方法是将所有内容存储为字符串。这需要“解析”,并且像“1”这样的数字不会直接显示,如果这是一个 double 值、 bool 值或其他任何值。 属性值表看起来像

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

然而,这会产生大量 NULL 值,这基本上就是该决定导致 EAV 模式的原因(减少未使用列中的 NULL 值)

因此,这导致了第三种可能的解决方案,即创建类型化属性表:

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 的经验吗?每次尝试的瓶颈是什么?

最佳答案

使用 NULL 方法。其他查询通常需要更多资源。

SQL Server 2008 提供了一些可以提供帮助的稀疏列。

我还发现您错过了实体的 Instance_Id 列 实体具有属性,并且该实体有许多实例。您需要将其与 GUID 链接

关于mysql - EAV 和数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16164574/

相关文章:

mysql - 如何在mysql EAV模型中实现数据过滤

php - 有人处理过多个中型表上的 ALTER TABLE 语句吗?

php - 如何使用 PHP 检查数据是否已存在于 MySQL 中

php - ejabberd 外部认证 php sql server

mysql - 通过在彼此之间嵌套子查询来解决 MySQL 中 61 个表 JOIN 的限制

mysql - 如何通过 'tag' 属性对数据库实体进行高级过滤

c# - 如果 EAV 是邪恶的,那么动态值使用什么?

mysql - 有没有办法从 stat 中找到 mysql 列中值的唯一计数,例如 information_schema.tables 中的 table_rows ?

mysql - 电影关系数据库设计

python - 添加新数据时无法从 mysql 数据库中获取 python 中的新数据