加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 08:46:16 所属栏目:MsSql教程 来源:网络整理
导读:有没有人在SQL Server中实现了非常大的EAV或开放架构样式数据库?我想知道是否有性能问题,以及如何克服这些障碍. 解决方法 无论MS 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框架中寻找的是一些样板代码,用于检索这样的多行结果集,并将属性映射到对象属性中,然后返回填充对象的集合.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读