触发器x PHP控制器


Triggers x PHP Controller

我需要做这样的事情:我有一种繁重的处理方法,我的客户访问了很多次执行该繁重方法的网站部分。所以我认为一种方法不是每次都执行这个重方法。

我的解决方案是什么?我将保存这个重方法第一次运行的值,并在没有更改的情况下使用这个已经处理过的值,使该方法再次运行。

比如说。我有一个"产品损坏计数器",我的客户访问主页时,系统会对他说"你有X个产品损坏了",当我的客户更改产品时,我会更改数据库上的一个标志,这个标志会对我说"再次运行重方法来计算这个"。

这种情况下,现在我怀疑,它最好使用触发器来说"当表产品发生更改时,将标志更新为false",或者在PHP上这样做?

如果我选择使用触发器,进程/数据库/内存/带宽的成本是多少?

我读到触发器很糟糕,因为它们的可维护性很低,而且新程序员很难找到这个函数。但它永远不会改变,不会很快改变。我在代码上有很多地方可以更改产品并关闭标志。

所以我知道php在很多方面都更好,但它更难实现。

你们能告诉我什么?

我会选择触发器。尽管有时它们可能会让人头疼,但它们允许集中代码并将其与应用程序逻辑分离,这意味着无论产品如何更改,数据库都会标记它进行处理。

也就是说,一个可能的整体高级处理流程可能如下:

  1. AFTER UPDATE触发器标记已更改的产品将product_id插入特殊表flagged_products
  2. 一个存储过程(让我们称之为sp_process_flagged_products)根据需要(当用户单击按钮时)或定期(例如每天一次),使用mysql事件或cron,处理标记的产品并从flagged_products表中清除处理的产品

现在,跟踪产品变化的触发器可能像一样简单

CREATE TRIGGER tg_product_update
AFTER UPDATE ON products
FOR EACH ROW
  INSERT IGNORE INTO flagged_products (`product_id`) VALUES (NEW.product_id);

。。。新程序员很难找到这个函数在哪里

要列出数据库中的所有触发器,请使用SHOW TRIGGERS

SHOW TRIGGERS
-- LIKE '%product%'

这是SQLFiddle演示。