1

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

我最终生成了太多的 SQL。

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

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

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

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

谢谢 !

4

1 回答 1

0

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

例子:

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

如果视图的性能不够,那么您确实可以查看触发器并更聪明地聚合总计,而无需重新读取所有记录。但我会先从视图开始,作为您最简单的选择。

于 2012-11-14T18:54:07.227 回答