在 2% 的所有用例中,存储过程/查询需要额外的字段。最佳实践?

广告

我在一个大型应用程序中的大约 50 个不同的地方使用了一个存储过程。这 50 个上下文中的一个需要此过程中的附加字段。

我可以想到两种不同的方法:

  1. 更新存储过程以返回缺失的字段。这意味着我将始终请求一些在其他 50 个用例中的 49 个用例中无用的额外数据。
  2. 让存储过程保持原样(没有所需的额外数据)。当我需要额外数据(50 个用例中的 1 个)时,在 SP 返回后查询基数以将 SP 结果集增强为专用 DTO。在这种情况下,我会将这个额外的代码添加到我的业务层中。这意味着额外的代码并在两个查询而不是一个查询中获取所有数据。

最佳做法是什么?

内维尔·库伊特

在我看来,“最佳实践”并不是一个非常有用的短语 - 这取决于您要优化的目标。

如果您的应用程序代码可以处理附加字段,则只需将该字段添加到结果集中就有很多参数。这是最少的努力,也是最少的复杂性。这并不奇怪 - 存储过程返回结果集是很常见的,然后应用程序代码决定如何处理该结果集(包括忽略某些列)。作为一般的“最佳实践”原则,让单个存储过程返回一个完整的结果集,并让客户端代码决定如何处理该结果集,使 proc 易于使用和重用,只要您不改变结果集,就可以改变程序的执行。在大多数情况下,传输一些额外字节的开销可以忽略不计——如果这一个问题,那么你就有更大的问题!

编辑以回应@vvgiri 的评论:

如果您必须连接到其他表以获取额外数据,则可能会对性能产生影响。在实践中,只要连接是一个简单的“外键/主键”连接,除非您有大量数据集,否则它可能不会产生可衡量的影响,但值得测试。

这种方法的问题在于您可能需要测试使用存储过程的所有 50 个位置。你没有在你的问题中写下这个;如果这不是问题,我会添加额外的字段。

如果这一个问题,我会考虑可维护性和“最小惊喜”因素。如果没有具体说明,很难说如果客户端代码调用一个存储过程,然后使用它的结果来获取更多数据,我是否会感到惊讶。但是,如果这会令人惊讶,我会考虑编写一个新程序,其名称清楚地说明其存在的原因。该过程可能应该调用原始过程,然后进行扩充,返回客户端代码所需的结果集。

这种方法意味着您的客户端代码保持“干净” - 没有意外或特殊情况。它重新使用原始过程 - 没有重复。它可能比修改原始 proc 慢,但不会比你的“选项 2”慢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

角2/4-从组件的所有html文件中的服务中获取变量的最佳实践?

我们可以在Angular 2中迭代所有用@Output()装饰的EventEmitter吗

在存储过程中显示2个具有不同列的不同选择查询

从Django查询postgres db列出拥有活动借书(tab2)的所有用户(tab1)的最佳方法?

在Angular 2中过滤数组的最佳实践

Angular 2的最佳实践

使用J2ME存储大量数据的最佳实践

Aerospike:zlib / bz2存储和检索没有用

Yii2,向数据库查询中添加额外的伪字段

在Angular2中拥有顶级组件是最佳实践吗?

django 中的 for 循环检索所有用户而不是一个和 M2M 字段数据输出

在 IBM DB2 中的存储过程中执行动态选择查询时出错

我可以在 DB2 中找到包含某个列的所有存储过程吗?

Retrofit 2模拟最佳实践

是否有用于Ivy存储库的最佳实践或工具?

在2个没有用户名的不同表中查找所有ID

具有2个AWS账户的AWS CodePipeline最佳实践

tf.keras中的MobileNetV2。链接很多,但没有有用的信息

是否可以向从基于类的视图返回的查询集中添加额外的值(查询中的 2 个字段的计算)

如何清除Angular2中的所有输入字段

FRAME2存储中ValueQuery有什么用?

在RxJava 2中的Observable.create()的正确用法(最佳实践)

Play2框架中单元测试的最佳实践

解释Angular 2中的MVC错误的最佳实践

在Angular中测试e2e,最佳实践

Angular 2中检索参数和queryParam的最佳实践

Symfony2中的依赖注入最佳实践

(SQL)编写存储过程以用多列中的数字替换月份(例如jan-2到1/2)

列出AD B2C的所有用户