sql - 数据库中大型集合的版本控制以用于撤消目的

标签 sql database database-design version-control wiki

有实体:CollectionItem。每个集合都有很多项目。 CollectionItem 都可以由应用程序的所有用户协作编辑。我必须提供一种方法来撤消更改。 Item 记录的版本控制很简单,困难的部分是控制 CollectionItem 之间的关系。

  • 允许对集合进行的操作是:在给定位置插入一个项目删除一个项目,以及改变一个项目在列表中的位置(这可以看作是在位置插入+在前一个位置对删除)。
  • 插入操作会被频繁调用。有时,批量导入可以将数千个项目插入到集合中。我应该能够恢复此类导入,并且执行撤消应该不会花费太多时间。
  • 列表可以包含 20 000 项或更多项。我宁愿负担不起在每次更改时都复制整个集合。
  • 我应该能够查看给定集合修订的状态,以发现修订中的更改。

如何在关系数据库中对此建模?

我一直在考虑使用多值 Temporal Property .在CollectionItem 旁边有一个带有vt_fromvt_to 时间戳的链接表。可能我还必须创建一个 CollectionVersion 实体,同样具有 vt_fromvt_to 属性。这些版本将列在集合的“历史”页面上。但是,我还没有想出恢复更改的通用算法。也许我应该将差异列表(添加/删除)连接到将用于该目的的 CollectionVersion

最佳答案

您所描述的内容应该很容易使用事件溯源进行建模。基本上,您希望将集合的更改 作为实体存储。任何时候的实际集合状态都可以通过应用与其关联的事件集合从创建到所需时间点来计算。

http://martinfowler.com/eaaDev/EventSourcing.html

http://codebetter.com/blogs/gregyoung/archive/2010/02/20/why-use-event-sourcing.aspx

关于sql - 数据库中大型集合的版本控制以用于撤消目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1966004/

相关文章:

mysql - 非聚合分组列是否需要 HAVING?

sql - 以有效的方式存储关系对象的修订

PHP和MYSQL DB设计: using a column vs another table

mysql - 为什么不使用记录的创建时间作为主键呢?

SQL Server 2008 : PIVOT throwing an error 'The conversion of the varchar value ' xxx' overflowed an int column.'

php - PHP 应用中的未读消息计数

以右表最后一项为条件的 SQL 连接

javascript - 管理数据库中用户之间的关系

php - 按 id 在链接上显示 2 个表

java - 大数据库,很多 map ?