sql-server – SQL Server上大型EAV /开放架构系统的性能

有没有人在sql Server中实现了非常大的EAV或开放架构样式数据库?我想知道是否有性能问题,以及如何克服这些障碍.

解决方法

无论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框架中寻找的是一些样板代码,用于检索这样的多行结果集,并将属性映射到对象属性中,然后返回填充对象的集合.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03