知识卡片

查找方法的设计需要了解客户端如何使用对象

普通读书笔记卡

内容

数据映射器的查找方法看起来像是”一次请求对应一次SQL查询”这么简单,但实际情况往往更复杂:加载一个带有多条订单行的主订单,很可能需要同时把这些订单行也一并加载进来——客户端的一次请求,常常意味着要成批加载一组相关对象。映射器设计者必须自己决定”一次执行该返回多少对象”,这个决定的目的是尽量减少数据库查询次数——但要选出最合适的读取方式,查找方法就必须相当了解客户端到底是怎么使用这些对象的,不能只按”每个类各自独立查询”这种最直白的方式设计。同理,如果要同时加载订单和订单行,通常用一个连接了两张表的单一查询、一次性把结果集加载成两种对象实例,会比分别查询快得多。可迁移启发:设计数据访问层的查询粒度时,不能只从”这张表/这个类该怎么查”的角度出发,而要先弄清楚上层调用方实际的访问模式(经常一起用的对象、常见的批量加载场景),再据此决定查询该合并到多细的粒度——脱离使用场景、只按数据模型设计出来的查询接口,性能往往会不尽人意。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第10章 数据源架构模式"之"10.4.1 运行机制"(源文件:_epub-src/OEBPS/Text/000087.html) - 结论依据:原文说明"加载一个有多个订单行的主订单可能会引起这些订单行的同时加载。而客户的请求通常需要加载一批对象。映射器的设计者确定一次执行返回的对象数量。这样做是为了最小化数据库查询,因此为了选用最好的方法读取数据,查找方法一般需要详细了解关于客户如何使用对象的信息",直接支撑本卡结论。 - 原始内容:如果想加载订单和订单行,通常使用连接了订单和订单行两个表的单个查询比较快。接着用结果集加载订单和订单行实例。