【问题标题】:Are database triggers the way to go with this business logic数据库触发器是采用这种业务逻辑的方式吗
【发布时间】:2012-11-03 07:53:54
【问题描述】:

我目前正在我的应用程序中实现一些“报告”,这些“报告”汇总了从数据库中获取的大量信息:一个表的每个单元格都来自另一个表的总数,而每个单元格都来自另一个表的总数等
报告应始终向用户显示最新数据:软件和报告中任何地方发生变化的每个数据都必须是最新的。

我最终生成了太多的 SQL。

我尝试缓存(在数据库中)中间结果和表格,这很有效。但是在应用程序中可以更改数据的任何地方,我都必须重新计算在太多地方以recomputeCache() 调用结尾的缓存(请记住,这是为了保持绝对最新的报告)。

DBMS 触发器可以工作:表上的触发器计算下一个触发器,它保存一个触发器计算下一个,等等。
但我害怕触发:

  • 那么复杂性呢?进行计算的代码非常大而且“聪明”:200 行充满语法糖的 .NET 将变成 500 行 PL/SQL。
  • 可维护性如何? PL/SQL 会不会更难查找、阅读、理解、修改、调试等?
  • 业务逻辑封装怎么样?这个计算不应该属于业务逻辑层吗?

我正在听取任何建议,帮助我在“典型”软件缓存(我会尝试找到一种智能缓存重新计算策略)和基于触发器的表重新计算(并且可能会牺牲软件最佳实践和可维护性?) ...

谢谢!

【问题讨论】:

  • 可以使用物化视图自动更新吗?

标签: database caching triggers business-logic


【解决方案1】:

对于您的报告,我会首先尝试使用视图。该视图将始终是最新的,因为它只是对基础表的最新数据的视图。这将为您省去与您指出的触发器相关的复杂性和一些令人头疼的问题。

例子:

CREATE VIEW report AS
SELECT 'sales' AS name, (SELECT sum(sales) FROM sales) AS value
UNION ALL
SELECT 'expenses' AS name, (SELECT sum(expenses) FROM expenses) AS value

如果视图的性能不够充分,那么您确实可以研究触发器并在聚合总计方面更聪明,而无需重新读取所有记录。但我会先从视图开始,这是您最简单的选择。

【讨论】:

  • 定义视图的查询每次执行都会太长,但正如 Vaibhav Desai 所说,物化视图可以解决这个问题。尽管如此,要聚合的数据量仍然很大,我不知道是否能够将其编写为单个 SQL 查询。我会深入研究的,谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 2014-01-27
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多