2011-09-08 86 views
9

我正在使用Ruby on Rails和PostgreSQL编写一个程序。系统会生成大量经常更新并且用户经常访问的报告。我在我是否应该使用Postgres触发器来创建报表(如Oracle物化视图)或ActiveRecord回调中构建的Rails之间存在着很大的分歧。有没有人对此有过任何想法或经验?数据库触发器与Rails ActiveRecord回调的优缺点?

回答

12

回调在以下情况下是有用的:

  • 结合在Rails的模型,其简化维护所有的业务逻辑。
  • 利用现有的Rails的型号代码
  • 便于调试
  • Ruby代码更容易被写入/比SQL“维修”

触发器是在下列情况下有用的阅读:

  • 表现是一个大问题。它比回调更快。

如果您的问题是简单和干净,然后使用回调。如果您的担心是表现,那么使用触发器。

+0

使用触发器时性能增加的原因是什么? – Zubair

+1

因为在回调中,你会连接到数据库,但是在触发器中,你不需要连接到数据库,你已经在db层 –

+0

啊是有道理的。谢谢 – Zubair

5

我们遇到同样的问题,既然这是一个有趣的话题,我会根据我们的选择/经验来阐述。

我认为这个概念比当前答案中强调的更复杂。由于我们在讨论报告,我假设用例是数据仓库表的更新 - 而不是“通用”应用程序(这种假设/区别是至关重要的)。首先,“易于调试”的想法并不一定是真实的。在我们的案例中,这样想实际上是适得其反的。

在足够复杂的应用程序中,某些类型的回调(数据仓库更新/数百万行代码/中等(或更多)大小的团队)根本不可能维护,因为数据库会有很多地方/方式更新,调试错过的回调几乎是不可能的。

触发器不一定必须设计为“复杂且快速”的逻辑。 具体来说,触发器也可以作为低级回调逻辑工作,因此简单而精益:它们只是将更新事件转发回Rails代码。

为了结束,在提到的用例中,应避免像鼠疫一样使用rails回调。

一个高效的设计是让RDBMS触发器将记录添加到队列表和一个轨道端排队系统,并对它们进行操作。 (因为这篇文章比较老,我很好奇OP是哪种体验)