saf*_*rov 21 php mysql revision-history
我有使用Codeigniter编写的系统和使用MySQL的数据库.系统具有用户,具有不同权限的用户组等.拥有许多具有多对多关系的mysql表.
我有一些表:
目前,我正在记录用户所做的这些表的数据的每个更改.用户可以根据其权限更改这些数据.存储日志的更改只是简单的形式
A user changed product features with id of A8767
B user added new customer with id 56
C user edited content of orderlist
A user added new product (id: A8767) to order (id: or67)
...
Run Code Online (Sandbox Code Playgroud)
我希望保留所有对每个细节所做的更改,例如编辑Stackoverflow问题的历史记录.我可以考虑log_table设计以保持各种表的所有数据更改.有没有办法,教程,引擎,插件来做到这一点?只有我能想到制作每张桌子的副本并继续存储它们的变化,但我不认为它的好方法.
Kai*_*aii 23
我已经考虑了一段时间了,现在只能想到两种方法.当制作成抽象数据层/模型时,两者都可以完全透明.
顺便说一下,ORM映射器原则中有"可版本化"表数据的实现.在他们的文档中查看此示例.也许这符合您的需求,但它不符合我的要求.它似乎删除了原始记录被删除时的所有历史数据,使其不是真正的修订安全.
选项A:拥有每个表的副本以保存修订数据
假设您有一个简单的联系表:
CREATE TABLE contact (
id INT NOT NULL auto_increment,
name VARCHAR(255),
firstname VARCHAR(255),
lastname VARCHAR(255),
PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
您将创建该表的副本并添加修订数据:
CREATE TABLE contact_revisions (
id INT NOT NULL,
name VARCHAR(255),
firstname VARCHAR(255),
lastname VARCHAR(255),
revision_id INT auto_increment,
type ENUM('INSERT', 'UPDATE', 'DELETE') NOT NULL,
change_time DEFAULT current_timestamp,
PRIMARY KEY(revision_id)
)
Run Code Online (Sandbox Code Playgroud)
跟踪INSERT和UPDATE使用AFTER触发器.在原始数据的每个新数据修订版中,在修订表中插入新数据的副本并type正确设置修改.
要记录DELETE版本安全,您还必须在历史记录表中插入新行!为此,您应该使用BEFORE DELETE触发器并在删除之前存储最新值.否则,您还必须删除NOT NULL历史记录表中的所有约束.
有关此实施的一些重要说明
UNIQUE KEY(此处PRIMARY KEY:),因为每个数据修订将多次使用相同的密钥.ALTER通过更新(如软件更新)架构和数据在原表中必须确保相同的数据或模式改正适用于历史表和它的数据了.否则,在恢复到较旧版本的记录集时,您将遇到麻烦.优点:
INSERT .. ON DUPLICATE KEY UPDATE ..在原始表上执行一个简单的声明,使用要回滚的修订版中的数据.优点:
如上所述,学说versionable做了类似的事情.
选项B:有一个中央变更日志表
前言:不良做法,仅用于说明替代方案.
这种方法很大程度上依赖于应用程序逻辑,应该隐藏在数据层/模型中.
您有一个跟踪的中央历史记录表
与其他方法一样,您可能还希望跟踪哪些单个数据更改属于单个用户操作/事务以及顺序.
优点:
优点:
结论: