gpt4 book ai didi

mysql - 一组数据结构的变化类似于SVN?

转载 作者:行者123 更新时间:2023-11-29 05:18:01 24 4
gpt4 key购买 nike

到目前为止,我们一直在存储更改信息,如下所示。想象一下,有一个被称为对象的被改变的东西的变更集表结构。该对象通过外键连接到外来元素。对象是这样创建的

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)

例如我必须选择具有 foreignKey 123 的对象或具有 foreignKey null 的元素,但存在一个具有相同 objectId 和 foreignKey 123 的条目。

依赖越多,这个 SQL 显然越难看。

我说清楚了吗?

在所有版本中始终保留所有字段不是更容易吗

例如一个简单的名称更改得到:

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

现在要创建差异,我必须比较两个版本,但我不必为选择正确的元素或计算所述时间戳的最终版本做额外的工作。

您认为经过验证的最佳解决方案是什么?svn 是怎么做到的?

最佳答案

对于您的用例,您建议的方法似乎更好。 LSM 树等键值存储的作用完全相同。他们只是编写对象的更新版本而不删除旧版本。如果在任何时候您需要所做的更改,我认为您可以只比较两个相邻的版本。

如果您有很多可变长度的文本字段,第二种方法可能会使用更多空间,但这是您在速度和可维护性方面做出的权衡。

关于mysql - 一组数据结构的变化类似于SVN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29956219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com