Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 类似于SVN的一组更改的数据结构?_Mysql_Sql_Svn_Data Structures - Fatal编程技术网

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树一样的键值存储也做同样的事情。他们只编写对象的新版本,而不删除旧版本。如果,在任何时候,您需要所做的更改,我认为您可以区分两个相邻的版本

如果有很多可变长度的文本字段,第二种方法可能会占用更多的空间,但这是在速度和可维护性方面的折衷