• 针对数据库中处理提取多份实体,而这些实体又分别包含1对多的相关数据情况的性能的架构


    我们在开发中通常会遇到这种问题,
    举个例子:
    我们需要在页面上显示最活跃的文章列表,而且每个文章都有多个关键字。
    通常情况下,我们没有办法通过一条SQL语句实现即获取全部文章而又获取这篇文章的关键字的信息,因为关键字和文章是多对多的关系。
    所以实际情况下,我们一般有2种解决方案:
    第一种:是先获取全部的文章数据,然后在页面上再次针对每篇文章的数据向数据库请求信息。
    第二种:在一条SQL语句中,先实现获取全部文章的SQL语句,然后再根据获取文章的SQL语句得到的文章标识,向标识文章和关键字关系的数据表发出查询请求。在Data层的操作点,则一次处理2个Result。

    以上两种方法是最经典的解决方案,但是都有些问题:
        第一个解决方案的问题是全部信息没有尽量在一次请求中完成,这对数据库所在的服务器和Web所在的服务器不是同一台服务器的情况性能影响很大。
        第二个解决方案虽然较第一个解决方案要好,但是问题是查询本身对数据库的性能依然有一定的消耗。

    我的解决方案:
    在文章的数据表中增加一个字段,Tags字段,类型为nvarchar(max)
    在插入文章的Tag的时候,向两处插入数据:
        一处是Tags字段,将所有的Tag以分隔符","分隔的形式保存。
        另一处是Tag和文章的关系表,通过在数据表间建立关系。

    这种解决方案的优点:
        虽然表面上看起来,该解决方案造成了一定程度的数据冗余,但是面对这种简单的数据(指Tag),采用这种方式能够在获取文章列表和根据Tag获取文章列表的操作中达到最低的性能消耗,而且在Data层的操作的代码反而更简洁。


  • 相关阅读:
    微信小程序、支付宝小程序、H5根据字符串生成相同的二维码
    大文件排序优化实践
    Nginx(五):http反向代理的实现
    Nginx(四):http服务器静态文件查找的实现
    关于大数据技术的一点思考
    Nginx(三):http模块的处理流程解析之正向代理
    基于Prometheus网关的监控完整实现参考
    谈谈mysql和oracle的使用感受 -- 差异
    Nginx(二): worker 进程处理流程框架解析
    退避算法实现之:客户端优雅回调
  • 原文地址:https://www.cnblogs.com/csharpsharper/p/1058467.html
Copyright © 2020-2023  润新知