0

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

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

所以,例如。我有一个“产品损坏计数器”让我的客户访问主页,系统对他说“您有 X 产品损坏”,当我的客户更改产品上的某些内容时,我将更改我的数据库上的一个标志,这个标志对我说“再次运行重方法来计算这个”。

就是这样,现在我怀疑,最好使用触发器说“当表产品发生变化时,将标志更新为假”,还是在 PHP 上做?

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

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

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

你们能告诉我什么吗?

4

1 回答 1

0

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

话虽如此,一个可能的整体高级处理流程可能如下:

  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演示。

于 2013-06-25T19:35:51.963 回答