我们在项目中要求存储数据库中实体的所有修订(更改历史记录).目前我们有2个设计方案:
例如,对于"员工"实体
设计1:
-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"
-- Holds the Employee Revisions in Xml. The RevisionXML will contain
-- all data of that particular EmployeeId
"EmployeeHistories (EmployeeId, DateModified, RevisionXML)"
Run Code Online (Sandbox Code Playgroud)
设计2:
-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"
-- In this approach we have basically duplicated all the fields on Employees
-- in the EmployeeHistories and storing the revision data.
"EmployeeHistories (EmployeeId, RevisionId, DateModified, FirstName,
LastName, DepartmentId, .., ..)"
Run Code Online (Sandbox Code Playgroud)
有没有其他办法做这件事? …
我有使用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设计以保持各种表的所有数据更改.有没有办法,教程,引擎,插件来做到这一点?只有我能想到制作每张桌子的副本并继续存储它们的变化,但我不认为它的好方法.
我的原始问题可以在这里找到,为此我得到了一些很棒的答案,idas和提示.
作为可行性和性能研究的一部分,我已经开始转换我的模式,以便使用这些想法对我的数据进行版本化.在这样做的时候,我想出了一些其他的问题.
在我原来的问题中,我的例子很简单,没有真正的关系引用.为了保留我之前问题的例子,我现在将'Name'部分扩展到另一个表.
所以现在,我的数据变成了:
Person
------------------------------------------------
ID UINT NOT NULL,
NameID UINT NOT NULL,
DOB DATE NOT NULL,
Email VARCHAR(100) NOT NULL
PersonAudit
------------------------------------------------
ID UINT NOT NULL,
NameID UINT NOT NULL,
DOB DATE NOT NULL,
Email VARCHAR(100) NOT NULL,
UserID UINT NOT NULL, -- Who
PersonID UINT NOT NULL, -- What
AffectedOn DATE NOT NULL, -- When
Comment VARCHAR(500) NOT NULL -- Why
Name
------------------------------------------------
ID UINT NOT NULL,
FirstName VARCHAR(200) NOT NULL,
LastName VARCHAR(200) NOT NULL, …Run Code Online (Sandbox Code Playgroud)