sql触发器和技术债务

时间:2013-09-04 16:15:04

标签: php mysql sql

我的老板让我通过在mysql数据库中使用与用户表关联的点来创建一个更容易找到点的系统。旧系统只有事件,有点值,然后是另一个表,其中为用户完成了事件,然后另一个表只有管理员给定的点。所以我的工作是将所有这些添加到一起并将它们放在一列中。现在他说问题在于仍有所有查询在添加点时运行,但是他们没有将它们更改为在任务完成时简单地向用户列添加点,而是建议我使用触发器简单地向用户列添加点,当其中一个列添加了点时。

对我而言,这听起来像是使用解决方案并创造技术债务。我错了吗?

我是系统新手,我不知道php页面中所有查询的确切位置,但如果这是创建技术债务,那么解决此问题的方法是什么。

我很新,我可能只是使用sql触发器,以免违背我老板的建议,我想至少知道聪明/最好的做事方式。

尽我所能提供非实际的,但接近实际的数据库架构 EVENT:ID,点值,Desc 用户事件:USERID,EVENTID,COM​​PLETION-STATUS GIVEN-POINTS:USERID,POINTS_GIVEN,DESC(每个时间点都给出,所以它更多的是日志而不是更新点)

我在基本的USER TABLE中添加了一个Points列 触发器将在用户事件完成状态=完成时,找到点值,添加到用户中的点,而不是更改查询来执行此操作。

1 个答案:

答案 0 :(得分:2)

只要业务规则相当简单,触发器就是完成您要完成的操作的完美有效方式。

有很多方法可以将数据从一个表移动到另一个表。您可以使用触发器,某种同步PHP进程或使用某种消息队列的异步进程。

触发器具有编码,维护和运行简单快速的优点。好处是你只需要做一次代码,这是特别好的,因为你不知道触及这些表的所有查询在哪里。缺点是您可能将业务逻辑放入数据库,这可能是您开始陷入技术债务的地方。另一个缺点就是你添加了另一个业务层,这对下一个开发人员来说可能并不明显,因此他们可能会花费大量时间来弄清楚汇总表的更新方式和原因。在这种情况下,评论是一件好事。

同步PHP进程很不错,因为代码执行的位置非常明显。另一个好处是您可以访问整个PHP应用程序上下文,并可以创建更复杂的业务规则。缺点是您必须将函数或方法调用放入可能触及表的每个位置。

异步PHP进程与同步PHP进程具有相同的优缺点,并且具有额外的好处,即它们不会降低用户体验的速度。它们创建起来也有点复杂;您必须处理未收到邮件或未按正确顺序收到邮件的情况。