2

简短版本:我正在寻找有关如何实现数据库版本控制系统的建议,该系统可以跟踪关系以及记录数据,以调节具有用户可编辑内容的社交网络应用程序。

长版:我正在开发一个所有用户都可以编辑内容的社交应用程序。举个例子,假设要编辑的项目的一种类型是Book. ABook可以有一个title和几个authors(与表的多对多关系authors)。当然这个例子比较简单;真实的物品会有更多的领域和关系,但规则应该是一样的。

现在,我需要实现一个版本控制系统来缓和用户所做的更改。假设有两组用户:普通用户受信任用户。普通用户所做的更改会被记录,但在版主接受该特定更改之前不会提交。受信任用户所做的更改会立即提交,但仍会记录下来,以便随时恢复。

如果我要保留示例中的 a 的修订Book,我需要跟踪与authors. 我需要能够跟踪添加和删除关系,并能够恢复它们。因此,如果title修改了,我需要能够恢复更改。如果与 an 的关系author被删除,我需要能够恢复它,并且如果添加了一些关系,我也需要能够恢复它。

我只需要跟踪一个项目和它的关系,而不是它相关的任何东西。如果我们有表foos,bars和,foos_bars我只会对日志记录感兴趣foos,会非常独立。foos_barsbars

我熟悉这个伟大的问题,以及它是一种对抗性的解决方案,以及关于第二种方法及其后续的相当全面的文章。但是,这些都没有特别考虑跟踪关系以及正常的表数据,这显然可以解决我的问题。

我喜欢一张表记录所有历史的方法,因为它可以轻松地只保留部分更改,并撤消其他更改。就像如果一个用户提交了字段Aand B,然后第二个用户提交了Aand B,那么很容易撤消第二个用户的B-change 并保留A. 与使用其他方法的许多表相反,为整个功能提供一个表也很好。它还可以很容易地查看谁做了什么(例如只修改了foobar字段) - 使用其他方法似乎并不容易。而且似乎使审核过程自动化会更容易——我们甚至不需要知道表名,因为所需的一切都存储在修订记录中。

如果我要使用一个修订表一个修订表的方法,在编写触发器方面的经验有限,我不知道是否有可能或相对容易实现一个自动记录编辑的系统,但除非设置了某些参数(例如edit_from_trusted_user == true),否则不会立即提交。它让我想到了当我真的不希望触发时调用的触发器(因为审核不适用于例如管理员所做的更改,或其他一些可能试图修改数据的“对象”)。

无论我选择哪种解决方案,似乎我都必须id为所有多对多关系表添加一个相当人为的方法(而不是[book_id, author_id]我本来应该的[id, book_id, author_id])。

我考虑过在单表方法中实现关系,如下所示:如果我们有标准的修订表结构

[ID] [int]
[TableName] [varchar]
[RecordID] [int]
[FieldName] [varchar]
[OldValue] [varchar]
[NewValue] [varchar]
[EventType] [enum]
[EventDate] [datetime]
[UserID] [int]

我们可以通过简单地将 and 设置为RecordIDor和and来存储FieldName关系的外键。唯一的问题是,我的一些关系有一些额外的数据(比如图的边权重),所以我也必须将它存储在某个地方。话又说回来,添加新关系的操作可以分成2个事件序列:ADD和SET(权重),但是需要人工关系s,我不确定这样的解决方案是否不会有一些坏处对未来的影响。NULLEventTypeADDDELETEOldValueNewValueID

将有大约 5 到 10 个版本化表,每个表平均有 3 个多对多关系要跟踪。我在 InnoDB 上使用 MySQL,应用程序是用 PHP 5.3 编写的,并使用 PDO 连接到数据库。将版本控制放在应用程序逻辑中而不是数据库触发器中对我来说很好。我只需要整个工作,并且相当高效。与编辑相比,我希望还原很少发生,与内容视图的数量相比,编辑将很少。只有版主才能访问修订数据,以接受或拒绝最近的更改。

您有实施此类系统的经验吗?有什么建议的解决方案来解决这个问题?有什么考虑吗?

我在 SO 和网络上搜索了很长一段时间,但没有找到任何可以帮助我解决这个问题的东西。但是,如果我错过了什么,我将不胜感激任何链接/方向。

谢谢。

4

0 回答 0