gpt4 book ai didi

mysql - 如何保持数据库中某些实体的更新(差异)

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:41 25 4
gpt4 key购买 nike

保持数据库中某个实体的更新(差异)的最佳方法是什么?在这里,在 StackOverflow,我们可以编辑问题和答案。然后我们可以查看我们想要的问题或答案的任何修订。例如:revisions一些随机问题。也许有人知道它在 StackOverflow 中是如何实现的?

在我的例子中要清楚我有一些实体(article)和一些字段(namedescriptioncontent)。许多用户可以编辑同一篇文章。我想保留文章更新的历史记录(类似于版本控制),我只想保留差异,而不是更新文章的全部内容。顺便说一句,我使用 PostgreSQL,但可以迁移到任何其他数据库。

UPD开放赏金,所以这里有一些要求。你不需要完全满足他们。但如果你这样做会好很多。尽管如此,非常感谢任何答案。所以我想拥有一种能力:

  1. 只保留差异,以免无故浪费我的空间。
  2. 获取某篇文章的任何修订(版本)。但是获取文章的最后修订版必须非常快。其他修订的获取速度并不那么重要。
  3. 获取某篇文章的任何差异(和差异列表)。文章可以在以下字段中进行更改:headerdescriptioncontent(如 StackOverflow 在标题和内容中有更改),因此必须考虑帐户。

最佳答案

过去,我用过diff-match-patch具有出色(且快速)的结果。它可用于多种语言(我的经验是使用 C#)。我没有完全按照您描述的过程使用它(我们对合并感兴趣),但在我看来您可以:

  1. 保存文章文本/标题/其他内容的初始版本。
  2. 进行更改时,使用 diff-match-patch 计算新编辑版本与数据库中已有版本之间的补丁。要获取数据库中的最新版本,只需按顺序将已生成的任何补丁应用到原始文章即可。
  3. 保存新生成的补丁。

如果您想加快速度,可以将文章的最新版本缓存在它自己的行/表/任何您组织的事物中,这样获取最新版本就是一个简单的 SELECT。这样,您将拥有初始版本、补丁列表和当前版本,从而提供一定的灵 active 和速度。

由于您有一组按顺序排列的补丁,因此获取文章的任何版本只需将补丁应用到所需的版本即可。

您可以 take a look at the patch demo看看它的补丁是什么样子,并了解它们有多大。

就像我说的,我并没有在这种情况下使用它,但 diff-match-patch 的设计目的是或多或少地完成你正在谈论的事情。当我对外部开发的库没有限制时,我可以使用这个库。

更新:一些示例伪代码

例如,您可以像这样设置您的表(假设还有一些其他表,例如作者):

Articles
--------
id
authorId
title
content
timestamp

ArticlePatches
--------------
id
articleId
patchText
timestamp

CurrentArticleContents
----------------------
id
articleId
content

然后一些基本的 CRUD 看起来像:

插入新文章:

INSERT INTO Articles (authorId, title, content, timestamp)
VALUES(@authorId, @title, @content, GETDATE())
INSERT INTO CurrentArticleContents(articleId, content)
VALUES(SCOPE_IDENTITY(),@content)
GO

获取每篇文章的最新内容:

SELECT 
a.id,
a.authorId,
a.title,
cac.content,
a.timestamp AS originalPubDate
FROM Articles a
INNER JOIN CurrentArticleContents cac
ON a.id = cac.articleId

更新文章的内容:

//this would have to be done programatically
currentContent =
(SELECT content
FROM CurrentArticleContents
WHERE articleId = @articleId)

//using the diff-match-patch API
patches = patch_make(currentContent, newContent);
patchText = patch_toText(patches);

//setting @patchText = patchText and @newContent = newContent:
(INSERT INTO ArticlePatches(articleId, patchText, timestamp)
VALUES(@articleId, @patchText, GETDATE())
INSERT INTO CurrentArticleContents(articleId, content, timestamp)
VALUES(@articleId, @newContent, GETDATE())
GO)

获取特定时间点的文章:

//again, programatically
originalContent = (SELECT content FROM Articles WHERE articleId = @articleId)
patchTexts =
(SELECT patchText
FROM ArticlePatches
WHERE articleId = @articleId
AND timestamp <= @selectedDate
ORDER BY timestamp ASCENDING)

content = originalContent
foreach(patchText in patchTexts)
{
//more diff-match-patch API
patches = patch_fromText(patchText)
content = patch_apply(patches, content)[0]
}

关于mysql - 如何保持数据库中某些实体的更新(差异),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29218546/

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