Mysql 类似于SVN的一组更改的数据结构?
到目前为止,我们存储的更改信息如下。 想象一下,有一个变更集表结构,它是一个被称为对象的被变更的对象。对象通过外键连接到外部元素。对象是这样创建的Mysql 类似于SVN的一组更改的数据结构?,mysql,sql,svn,data-structures,Mysql,Sql,Svn,Data Structures,到目前为止,我们存储的更改信息如下。 想象一下,有一个变更集表结构,它是一个被称为对象的被变更的对象。对象通过外键连接到外部元素。对象是这样创建的 changesetId (Timestamp) | objectId | foreignKey | name (String) | description (String) 2015-04-29 23:28:52 | 2 | 123 | none | none 现在我们更改名称,名称更改后的表将
changesetId (Timestamp) | objectId | foreignKey | name (String) | description (String)
2015-04-29 23:28:52 | 2 | 123 | none | none
现在我们更改名称,名称更改后的表将与此类似
changesetId (Timestamp) | objectId | foreignKey | name (String) | description (String)
2015-04-29 23:28:52 | 2 | 123 | none | none
2015-04-29 23:30:01 | 2 | null | foo | null
这种结构正是最小的。它完全包含了我们所做的更改。但要创建对象的当前版本,我们必须将更改相加,才能得到最终版本。例如
changesetId (Timestamp) | objectId | foreignKey | name (String) | description (String)
2015-04-29 23:28:52 | 2 | 123 | none | none
2015-04-29 23:30:01 | 2 | null | foo | null
*2015-04-29 23:30:01 | 2 | 123 | foo | none
*标记最终版本,该版本在数据库中不存在
因此,如果我们只准确地存储更改,我们还有更多的工作要做。特别是,当来自异物时f
。如果我有许多对象f
,并且我想从表中获取对对象的所有更改,那么我必须创建一个丑陋的SQL。这显然变得更糟,你有更多的异物
基本上我必须做:
Select all F that I want and
Select all objects WHERE foreignKey = foreignId
OR Select all objects that have objectId in (Select all objects that have foreignKey = foreignId)
e、 g.我必须选择具有foreignKey 123的对象或具有foreignKey null的元素,但存在一个与foreignKey 123具有相同objectId的条目
依赖关系越多,显然,这种SQL变得越丑陋
我说清楚了吗
在所有版本中始终保留所有字段不是更容易吗
e、 g.一个简单的名称更改会得到:
changesetId (Timestamp) | objectId | foreignKey | name (String) | description (String)
2015-04-29 23:28:52 | 2 | 123 | none | none
2015-04-29 23:30:01 | 2 | 123 | foo | none
现在要创建一个diff,我必须比较两个版本,但我不必做额外的工作来选择正确的元素,也不必计算所述时间戳的最终版本
你认为最好的解决方案是什么?
svn是如何做到的?对于您的用例,您建议的方法似乎更好。像LSM树一样的键值存储也做同样的事情。他们只编写对象的新版本,而不删除旧版本。如果,在任何时候,您需要所做的更改,我认为您可以区分两个相邻的版本 如果有很多可变长度的文本字段,第二种方法可能会占用更多的空间,但这是在速度和可维护性方面的折衷