我问自己,为网站创建历史表的最佳方法是什么,我只知道两个选择:
他们说触发器是一种更好的方法,因为负载将在数据库而不是程序中。但由于我的网站有多个管理员,我还需要跟踪谁修改了内容,我认为这只能通过在历史记录表中创建modified_by
列并通过插入会话用户手动插入值来实现。使用第二个选项以及time_modified
,modified_from
,modified_to
值到该列。
我需要知道这是否是使用第二种选择的可接受理由?还有其他选择吗?第二种选择是否会在未来产生任何问题?
答案 0 :(得分:3)
有一个Rails gem https://github.com/airblade/paper_trail可以全面实现您提到的功能。我认为它纯粹是在应用程序代码级别而不是数据库(触发器)级别。这可以进一步表明选项2更好。我的想法是:
如果使用触发器,随着网站流量的增加和CRUD操作的增加,您将会有严重的性能折衷。那么很多触发器都会消失。
在数据库级别实现业务逻辑的某些部分可能很诱人,但我想将它保存在我的应用程序代码中的一个位置。
如果您希望保持应用程序数据库不可知,那么您将有一些认真的想法。如果使用其他数据库服务器,则需要重新实现触发器。
历史记录不断增加表大小,可能会成为数据库性能的瓶颈。您可以选择在有限的时间间隔内保留历史记录,然后将其存档以使数据库表保持良好和干净。此外,您可以拥有一个单独的数据库服务器,仅负责历史记录相关的表。这些事情与触发器相关很复杂。
答案 1 :(得分:1)
我可以建议解决方案#2。因为我喜欢所有业务逻辑包含在一个地方(在PHP后端)。此代码将更具可支持性和可重用性。并且您只能将更改的字段保存为某种JSON
格式。所以它保持你的硬盘的位置,并将快速工作。我认为触发器是非常糟糕的东西,因为你不知道下次在DB中会发生什么(你必须永远记住所有的触发器):)所以我不使用它。
您只会遇到一个问题 - 历史记录表中有很多记录。因此,我建议删除最早3个月的记录
答案 2 :(得分:1)
我选择选项2.如果您对ORM感到满意,我建议您在这里使用一个:大量的历史收集代码已经为您编写和测试。
例如,如果您使用Propel,它会附带一个versionable behaviour,它管理一个单独的版本表,以及每行的版本号。 (旁白:我认为版本2还没有发布,虽然它是从项目主页链接的。我使用1.7版本,这仍然很棒。据我所知,这两个版本都有这个功能。)
Doctrine有一个类似的功能Versionable,虽然它看起来不赞成使用EntityAudit。