用于调节内容更改的数据和关系的数据库修订

时间:2012-07-28 14:20:27

标签: relational-database

简短版本:我正在寻找有关如何实施数据库版本控制系统的建议,该系统可以跟踪关系以及记录数据,以便使用用户可编辑的内容来管理社交网络应用。< / p>

长版本:我正在开发一个社交应用,所有用户都可以编辑内容。举个例子,假设一种要编辑的项目是BookBook可以有title和几个authors(与authors表的多对多关系)。当然这个例子很简单;真实物品将有更多的领域和关系,但规则应该是相同的。

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

如果我要保留示例Book的修订版,我需要跟踪与authors的关系变化。我需要能够跟踪添加和删除关系,并能够还原它们。 因此,如果title被修改,我需要能够恢复更改。如果与author的关系被删除,我需要能够恢复它,以及如果添加了一些关系,我也需要能够恢复它。

我只需要跟踪一个项目及其关系,而不是它与之相关的任何内容。如果我们有表格foosbarsfoos_bars,我只会对记录foosfoos_bars感兴趣,bars会很漂亮独立的。

我熟悉this great question,以及kind-of-an-adversary solutionpretty comprehensive article on the second approachit's follow-up。但是,没有人会特别考虑跟踪关系以及正常的表格数据,这些数据很明显地解决了我的问题。

我喜欢one-table-for-all-history方法,因为它允许轻松保留部分更改,并撤消其他更改。就像一个用户提交字段AB,然后第二个用户提交了AB一样,只需撤消第二个用户的B - 改变,并保持A。拥有一个表用于整个功能也很好,而不是使用其他方法的许多表。它还可以很容易地看到谁做了什么(例如仅修改了foobar字段) - 使用其他方法似乎并不容易。似乎自动化审核过程会更容易 - 我们甚至不需要知道表名,因为所需的一切都存储在修订记录中。

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

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

我想过在一个表方法中实现关系是这样的: 如果我们有标准的修订表结构

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

我们可以通过简单地将RecordIDFieldName设置为NULL,将EventType设置为ADDDELETE以及{{}来存储关系1}}和OldValue到关系的外键。唯一的问题是,我的一些关系有一些额外的数据(如图的边缘权重),所以我也必须将它存储在某个地方。然后,添加新关系的操作可以分为2个事件序列:ADD和SET(权重),但是然后需要人工关系NewValue,我不确定这样的解决方案是否会将来会有一些不好的影响。

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

您是否有实施此类系统的经验?这个问题的建议解决方案是什么?想到的任何考虑因素?

我搜索SO和网了很长一段时间,但没有找到任何帮助我的事情。但是,如果我错过了什么,我会感激任何链接/指示。

感谢。

0 个答案:

没有答案