我想问问你的意见,在使用MySQL触发器或交易中的网站。

实际上我有一个历史 payment 表- UserId | OperationId | Comment | Credits | Sign (debit or credit).所以每个支付操作插入在本表格。

然而,它将耗费时间的计算每一时间信贷总量的用户,每一次,他做的行动。所以我想也许是一个很好的想法,以保持总信贷额每个用户在一个用户 profile 表。

这里的问题。我怎样才能确定总额信贷的形式 profile 表将保持同步的行动 payment 历史表?

我认为,使用2种方法:

  • MySQL触发器或
  • 交易编码的源代码

这是更可靠吗?如果我有什么大的数据库(在100,000个用户)?

你有任何建议,要做到这一点?

BD MySQL引擎是少.

有帮助吗?

解决方案

毫无疑问,我将排除了触发器并严格的住宿与交易。

触发器,通过大自然,保存程序。他们的行动几乎是难以回滚.即使所有潜在的表少,则将体验一个积成比例的共同行锁和令人讨厌的间歇性,从独行锁。这样将能的情况下,如果触发了操纵表 插入并更新停滞不前正在执行的重型MVCC内的每一通电话,一个触发器.

结合这样的事实, 正确的数据验证协议是不是实现MySQL的存储程序的语言. 商业智能是确定必须包含在一个数据库提供所储存的程序的语言可以处理事务的环境.作为一个MySQL DBA,我必须诚实地说,这种情况不是与MySQL.Oracle(PL/SQL),PostgreSQL(PL/pgSQL)和SQL服务器(T-SQL)有这种边缘过MySQL.

有关的交易,MySQL有少作为其主要酸符合标准的储存引擎(Deafult储存引擎在MySQL5.5).它具有优良的崩溃,恢复和遵守酸遵守协议。

我会选择transacitons超过触发器每个单一的时间。

其他提示

我同意Rolando的评估。你的业务逻辑应该驻留在你的应用程序和应对数据库进行更改事务处理的.

扩展到100 000名用户使用,当然,取决于应用程序和数据库的业务也产生。MySQL的下一个重的事务编写的载荷,你可能会很快面临的负担分片和/或复制数据集,以便保持可接受的应用程序的反应。

但是,也有替代品的碎片MySQL.他们中的一个 Clustrix (雇主的),这是一个平行的可扩展的高性能的单的实例SQL数据库系统。这是一个群集的数据库系统,提出了自己作为一个单MySQL server.扩展的数据库中描述的这个线无缝地到100,000个用户在一个单一实例的Clustrix将需要有分区并没有额外的应用程序的逻辑。

很好的答案,从Rolando.

此外触发器--不应该用于逻辑,因为一对夫妇间有关的触发后,事情会变得混乱快。一个漂亮的一套指示在一个存储程序或客户端过程中可以得到整个业务的逻辑,更清楚地比一堆隐藏的逻辑数据库。也有限制的触发器相对于表他们获得由--因此你可能会发现自己分裂的逻辑,在两个不同的地方..

此外--你可能会找到方法来优化在什么时候这些计算发生在你的商务逻辑服务器,而触发会触发的每一个单一的时间。你会发现自己关掉了扳机,更新该表,然后重新启用的触发--这也意味着你需要把触发逻辑 代码。

此外--你不必有所有的逻辑,在商务逻辑的一部分代码-你可能想到实施表的完整性,通过使用储存的程序。这可以开始交易,做你多更新,有的东西滚回很好如果事情失败。那边有人在看该数据库可以看到的逻辑插入了,例如。这是不太重要,在今天的世界由于网络的服务可能是单一的入口,数据库;但在的情况下多可执行程序有权访问数据库,这可能是巨大的。

此外--你会有交易,无论如何你是不是要执行你的触发器,没有一个...对吗?所以这是好事知道如何启动一个交易;做一些东西;然后结束一项交易。如果你看到这种模式在代码中有一段代码使用这将是光在认知负荷。一个触发的,如果你记得,它是存在的,将军,你有不同的想法对于那些交易受到影响的触发器,特别是如果其表是拉,还可能触发器。

基本上,之间的定期定时的工作(或者数据库剂的工作)和良好的储存程序,可以完成的99%你想要什么。的1%;重新考虑该项目。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top