在 2% 的用例中,存储过程/查询需要额外的字段。最佳实践?
Stored procedure / query needing additional field in 2% of all use-cases. Best practises?
我有一个存储过程在一个大型应用程序的大约 50 个不同地方使用。这 50 个上下文之一将需要此过程中的附加字段。
我可以想到两种不同的方法:
- 将存储过程更新为 return 缺少的字段。
这意味着我将始终请求一些在其他 50 个用例中的 49 个中无用的额外数据。
- 让存储过程保持原样(没有所需的附加数据)。
当我需要额外的数据(50 个用例中的 1 个)时,在 SP returns 之后查询基础以将 SP 结果集增强为专用 DTO。
在这种情况下,我会将这个额外的代码添加到我的业务层中。
这意味着额外的代码并在两个查询中获取所有数据而不是一个。
最佳做法是什么?
在我看来,“最佳实践”并不是一个非常有用的短语 - 这取决于您要针对什么进行优化。
如果您的应用程序代码可以处理附加字段,则有很多理由支持将该字段添加到结果集中。这是最少的努力,也是最少的复杂性。这并不奇怪——存储过程 return 结果集是很常见的,然后应用程序代码决定如何处理该结果集(包括忽略某些列)。作为一般的“最佳实践”原则,拥有单个存储过程 return 完整的结果集,并让客户端代码决定如何处理该结果集,使得过程易于使用并且 re-use ,并且只要不更改结果集,就可以更改过程的实现。在大多数情况下,传输几个额外字节的开销可以忽略不计 - 如果它 是 一个问题,你有更大的问题!
编辑以回应@vvgiri 的评论:
如果您必须连接到其他表以获取额外数据,可能会对性能产生影响。实际上,只要连接是一个简单的“外 key/primary 键”连接,除非您有 huge 数据集,否则它可能不会产生可衡量的影响,但值得测试.
该方法的问题是您可能需要测试所有 50 个使用存储过程的地方。您不会在问题中写这个;如果这不是问题,我会添加额外的字段。
如果是问题,我会考虑可维护性和“最不意外”因素。没有具体细节,很难说如果客户端代码调用一个存储过程,然后使用它的结果来获取更多数据,我是否会感到惊讶。但如果这会让人感到惊讶,我会考虑编写一个新过程,其名称可以清楚地说明它存在的原因。该过程可能应该调用原始过程,然后进行丰富,return生成您的客户端代码所需的结果集。
这种方法意味着您的客户端代码保持“干净”——没有意外或特殊情况。它 re-use 是原始过程 - 没有重复。它可能比修改原始 proc 慢,但不会比您的“选项 2”慢。
我个人认为我只需要在我的过程中包含一个变量,如果我想要额外的列,我可以在我的执行查询中设置它,使用这个变量根据需要调整输出
我有一个存储过程在一个大型应用程序的大约 50 个不同地方使用。这 50 个上下文之一将需要此过程中的附加字段。
我可以想到两种不同的方法:
- 将存储过程更新为 return 缺少的字段。 这意味着我将始终请求一些在其他 50 个用例中的 49 个中无用的额外数据。
- 让存储过程保持原样(没有所需的附加数据)。 当我需要额外的数据(50 个用例中的 1 个)时,在 SP returns 之后查询基础以将 SP 结果集增强为专用 DTO。 在这种情况下,我会将这个额外的代码添加到我的业务层中。 这意味着额外的代码并在两个查询中获取所有数据而不是一个。
最佳做法是什么?
在我看来,“最佳实践”并不是一个非常有用的短语 - 这取决于您要针对什么进行优化。
如果您的应用程序代码可以处理附加字段,则有很多理由支持将该字段添加到结果集中。这是最少的努力,也是最少的复杂性。这并不奇怪——存储过程 return 结果集是很常见的,然后应用程序代码决定如何处理该结果集(包括忽略某些列)。作为一般的“最佳实践”原则,拥有单个存储过程 return 完整的结果集,并让客户端代码决定如何处理该结果集,使得过程易于使用并且 re-use ,并且只要不更改结果集,就可以更改过程的实现。在大多数情况下,传输几个额外字节的开销可以忽略不计 - 如果它 是 一个问题,你有更大的问题!
编辑以回应@vvgiri 的评论:
如果您必须连接到其他表以获取额外数据,可能会对性能产生影响。实际上,只要连接是一个简单的“外 key/primary 键”连接,除非您有 huge 数据集,否则它可能不会产生可衡量的影响,但值得测试.
该方法的问题是您可能需要测试所有 50 个使用存储过程的地方。您不会在问题中写这个;如果这不是问题,我会添加额外的字段。
如果是问题,我会考虑可维护性和“最不意外”因素。没有具体细节,很难说如果客户端代码调用一个存储过程,然后使用它的结果来获取更多数据,我是否会感到惊讶。但如果这会让人感到惊讶,我会考虑编写一个新过程,其名称可以清楚地说明它存在的原因。该过程可能应该调用原始过程,然后进行丰富,return生成您的客户端代码所需的结果集。
这种方法意味着您的客户端代码保持“干净”——没有意外或特殊情况。它 re-use 是原始过程 - 没有重复。它可能比修改原始 proc 慢,但不会比您的“选项 2”慢。
我个人认为我只需要在我的过程中包含一个变量,如果我想要额外的列,我可以在我的执行查询中设置它,使用这个变量根据需要调整输出