10

有没有人在 SQL Server 中实现了一个非常大的 EAV 或开放模式样式数据库?我想知道这是否存在性能问题以及您如何克服这些障碍。

4

2 回答 2

9

无论 MS SQL Server 与任何其他品牌的数据库如何,EAV 最糟糕的性能问题是人们试图进行怪物查询以重建单行上的实体。 这需要每个属性单独连接

SELECT e.id, a1.attr_value as "cost", a2.attr_value as "color",
  a3.attr_value as "size", . . .
FROM entity e
  LEFT OUTER JOIN attrib a1 ON (e.entity_id = a1.entity_id AND a1.attr_name = 'cost')
  LEFT OUTER JOIN attrib a2 ON (e.entity_id = a2.entity_id AND a2.attr_name = 'color')
  LEFT OUTER JOIN attrib a2 ON (e.entity_id = a3.entity_id AND a3.attr_name = 'size')
  . . . additional joins for each attribute . . .

无论您使用什么数据库品牌,查询中的更多连接都意味着性能成本呈几何级增长。不可避免地,您需要足够的属性来超出任何 SQL 引擎的架构能力。

解决方案是获取行而不是列中的属性,并在应用程序代码中编写一个类来循环这些行,将值一一分配到对象属性中。

SELECT e.id, a.attr_name, a.attr_value
FROM entity e JOIN attrib a USING (entity_id)
ORDER BY e.id;

这个 SQL 查询非常简单和高效,它弥补了额外的应用程序代码。

我在 EAV 框架中寻找的是一些样板代码,它检索这样的多行结果集,并将属性映射到对象属性,然后返回填充对象的集合。

于 2008-10-23T21:52:00.670 回答
1

我不是 EAV 方面的专家,但有几个比我更有经验的开发人员评论说,Magento 的开源电子商务框架很慢,主要是因为通过 MySQL 的 EAV 架构。最明显的缺点是不容易克服的。这就是随着应用程序大小的增加,解决实体和属性值在何处以及如何表示信息的困难。我听到的反对 EAV 的第二个论点是它需要进入低两位数的表连接,但有人评论说使用 InnoDB 而不是 MyISAM 提高了一些性能(或者反之亦然,但我不记得完全)。

于 2008-10-11T19:37:06.860 回答