sql-server - 包含太多业务逻辑的 (T)Sql View

标签 sql-server t-sql sql-view data-layer application-layer

我有一个 TSQL View 。除了几列之外,它非常基本,因为它只是执行一些连接,然后将所有内容粘合在一起以呈现应有的良好 View 。然而,少数不那么简单的列使得 View 代码很难扩展,现在新的需求出现了,复杂的列的业务逻辑变得无效。

无需过多详细说明,我的数据库中有一个表:

tblEmployment

这由“就业”行组成。每次对于给定的就业情况,行中的任何列发生变化(假设 employmentTitle 发生变化),当前行都会被推送到另一个表 tblEmploymentHistory 中,并且tblEmployment 中的行已更改,因此它包含最新的 employmentTitle

本质上, View 的作用是尝试将 tblEmployment 上的 tblEmploymentHistory 与唯一的 EmploymentIdentifier 连接起来,这是有道理的。

View 中更复杂的列将尝试通过对它连接在一起的行(即从 elapsedTime )进行各种计算来计算一个数字(每行 tblEmployment and tblEmploymentHistory )。为了获取耗时,它根据规定的业务逻辑执行计算,例如只有历史记录表中的特定日期时间列才应计入总 elapsedTime,并且仅当该行中的其他列设置为特定值等时才应这样做。

现在新的需求进来了,业务逻辑比以前复杂了很多。我发现很难扩展 View 以包含此内容,因为它变得非常困惑,并且我认为这可以在应用程序层中更加结构化地完成,其余业务逻辑也驻留在应用程序层中!

废弃 View 并将其移动到我的应用程序的应用程序层是否“正确”?显然,拥有 View 的好处是速度快,并且在代码中计算大约 100.000 行将需要一些时间。但是,可以通过过滤掉行来优化它,使数字在 10.000 左右。

解决这个问题的“标准”和最干净的方法是什么?

最佳答案

答案取决于几件事。首先,确保数据库正在执行基于集合的工作。如果您开始使用游标(一般来说)或某种循环,最好将其放在应用程序中。关系数据库以这种方式工作效率不高。我要考虑的另一件事是您工作环境的标准是什么?您所在的数据库中是否还维护着其他类似的内容?如果是这样,您可能希望保持一致。

最终,无论什么最有效地返回这些结果,并且不影响其他查询,都应该是答案。

关于sql-server - 包含太多业务逻辑的 (T)Sql View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32480152/

相关文章:

SQL 和转义的 XML 数据

mysql - 结合 SQL View 和 Left Outer Join 查询

mysql - 使用 JOIN (?) 有意返回多于行的结果

sql - 在 SQL Server 中使用列名检索列值

sql - 计算两行T-Sql之间的持续时间

SQL IF/ELSE 语句

SQL:如何在不使用函数的情况下从表中获取上一个日期

.net - 在 SQL 中正确使用 IN

sql-server - SQL Server 支持哪个版本的 .NET 框架?

.net - 当底层 SQL View 数据发生变化时保持 GUI 更新的最佳方法是什么?