允许对数据库条目(数据)进行版本控制的方法有哪些?
考虑一下内容管理系统还原文章更改的能力。
他们的优点/缺点是什么?
允许对数据库条目(数据)进行版本控制的方法有哪些?
考虑一下内容管理系统还原文章更改的能力。
他们的优点/缺点是什么?
Answers:
基本上有两种方法:审核表,其中存储了所有以前的值,或者在表中包括开始/结束日期,所有更新都创建了新记录,同时关闭了旧记录。
更新:SQL SERVER 2016支持将此作为设计模式/表类型— https://docs.microsoft.com/zh-cn/sql/relational-databases/tables/temporal-tables?view=sql-server-2017
一种想法是使用“仅插入数据库”。基本思想是您永远不会删除或更新数据。
每个需要跟踪的表都有两datetime
列from
和to
。它们从NULL
每个值开始(时间开始到时间结束)。当您需要“更改”行时,可以添加新行,同时to
将上一行中的Now
和更新为from
要添加到的行Now
。
有关更多详细信息,请参见:
这项技术被称为AuditTrail
管理遗留数据,并且它可以存储更改历史记录。
似乎已经发布了这种性质的问题:
我认为您可以为每个表使用触发器并在_history中维护数据(或者可以给任何名称),并且在主表的每个插入,更新,删除操作上都会触发触发器,并且可以将详细信息保存在此表中。如果您正在使用SQLite数据库,它也可用于SQLite数据库。
该机制对于大型项目也很有用。在此表中,您可以记录进行了更改的用户的信息以及更改的时间戳。然后,您可以将表恢复到符合您要求的任何时间戳记。
每个数据库都有其自己的编写和编码触发器的方式。如果您使用的是SQLite,请访问SQLite.org获取语法。对于其他数据库,您可以访问其官方站点。
您可能知道Sqlite数据库引擎。整个数据库保存在一个文件中。该api还支持虚拟文件系统,因此基本上您可以在任何地方以任何格式组织存储,只需响应特定文件偏移量的读取和写入操作即可。对此的可能应用可能是加密,压缩等。最好的部分是,容器层应该不了解数据库,sql或sqlite文件格式的任何信息,只需遵循xRead和xWrite回调即可。
想法之一是实现时光机功能。因此,任何xWrite操作都会保存将在“撤消”历史记录中覆盖的每个段,并且用户可以选择过去的日期以查看数据库所包含的内容(可能是只读模式)。我还没有有效的示例(在sqlite邮件列表中有关于它的讨论),但是可能其他引擎提供了VFS API,因此类似的事情是可能的。并且一旦实现,它就应该与任何复杂的数据库结构兼容。
我们用于对数据库条目进行版本控制的方法是使用审核表。该表具有以下模式:
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
然后,我们在要跟踪的表的“插入/更新/删除”上具有触发器。
优点:
缺点:
我正在为此做一个版本。对于每个记录,我都有一个插入日期,修改日期和活动记录布尔值标志。对于初始插入,“插入”和“修改”日期都设置为Now()(此示例在Access中),并且“活动记录”标志设置为true
。然后,如果我修改该记录,则将整个内容复制到新记录,更改用户要更改的字段,我将“插入”日期保留为原始日期,并将“修改日期”更改为Now()。然后,将原始记录的“活动记录”标志翻转为false
,将新记录的翻转为true
。我还有一个ModifiedRecordsParentID字段,用于保存原始记录的标识。
然后,如果我什至需要查询,我可以只返回记录在哪里,ActiveRecord = true
而我只会得到最新的信息。
ActiveRecord
标志。MAX(*)行应始终为当前记录。恢复到以前的版本只需将所述行再次插入表中。
select top 1 order by id descending
操作即可。
另外,如果您希望将所有更改存储到数据库中,那么您可能需要签出日志记录(/programming/3394132/where-can-i-find-the-mysql-transaction-log)