-
Recent Posts
Recent Comments
- rainywh269 on 就是她们,LISP妹纸
- jackchu on 如何写一个冷博客
- Albert Lee on Common Lisp Condition System手记
- yugi on Common Lisp Condition System手记
- Albert Lee on About
Archives
Categories
Meta
Tag Archives: database
处理逻辑放程序中还是放数据库中?
本来这篇原来的标题是:《Postgres 中trigger, rule, PL/pgSQL 应用一例》但写着写着就想大了,索性摊开了写。 作为一个从Mysql转移过来的PostgreSQL的新用户,我经常像刘姥姥进大观园似的,对一些DBA们早就当作稀松平常的事情惊叹不已,感觉好老土阿。程序员和DBA之间还是有好多不同的思维方式阿。 吸引我从Mysql转向Postgres的一个原因是pg的健壮性,另一个重要的原因就是它的可编程性。pg比mysql有更多的“专业级”数据库的特性。例如:trigger, rule, 等,他们比mysql中更完善。另外PG内可以用 PL/pgSQL 以及Python、Perl等作为脚本语言,扩展内置的函数。这一点很吸引我。 这里举一个刚刚遇到的应用场景:PG数据库作为日志接收,一个客户端程序向它灌入数据。这个简单的模型已经运行了一段时间了。 好,需求开始进化了。 现在需要在插入日志的同时,抽取一份信息出来,更新到另一个表里。在插入数据的同时还需要判断是否存在,如果记录已经存在,则更新下记录的 modified_time。 按照一般应用开发的思路,这些操作都可以在数据库客户端程序里面改。这样的好处是: 可以用客户端程序的编程语言实现,实现起来没有门槛 数据库端逻辑较简单 缺点: 当数据库与其客户端不在一台机器上的时候,每插入一条记录,都需要先进行判定,增加了网络传输 数据库端虽然逻辑简单了,但是这些逻辑都加在了客户端,而实际上,客户端本不应该知道这些逻辑的。因为客户端的职责很简单,就是灌入数据,至于怎么进行后续的处理,它不应该管。 基于上面的考虑,我确定在Postgres 数据库中实现这些处理逻辑。 分解一下这些需求: 1. 首先在原有表A上insert 一条数据时,通过trigger ,执行一个 Pl/pgSQL 函数: 2. B表在进行 insert前,先判断是否存在val的记录,通过一个 rule 完成: 3. 在修改一个记录的时候, 更新修改时间,通过一个 trigger完成: … Continue reading