如何保持多语言数据和树结构版本化?
How to keep both multi-lingual data as well as tree structures versioned?
我目前正在开发一种工具来构建和修改书籍和文章。
- 一本书包含文章并具有特定结构
- 一篇文章可以在同一本书中出现多次
- 它是多语言的,因此每篇文章可以(但不一定)使用不同的语言。 (如果所选语言没有任何数据,只显示通知或类似内容即可)
- 稍后,可能会添加新的语言
- depth/nesting是动态的(一篇文章可以有子文章)
- 文章和结构都必须进行版本控制(我稍后必须能够恢复特定状态)
这是我目前对数据库的处理方法:
有了这个,我可以像这样获取最新版本的书:
SELECT *
FROM books AS b
JOIN structure AS s ON s.book_fk = b.id
AND s.book_version_nr =
(
SELECT MAX(s2.book_version_nr)
FROM structure AS s2
WHERE s2.book_fk = b.id
)
JOIN articles AS a ON a.id = s.article_fk
JOIN article_texts AS as ON as.article_fk = a.id
AND as.version_nr = s.article_version_nr
AND as.language_fk = 'languageIdFromScript'
WHERE b.id = 'bookIdFromScript'
ORDER BY s.position ASC
但是,这意味着:
- 如果我创建文章的新版本,我必须更新最新的结构以反映这一点(但这也意味着我 "lose" 版本因为内容现在已更改)
- 如果我添加、删除或移动一篇文章,我必须为最细微的变化创建一个全新的结构版本(这会导致数据库中的大量数据非常快,并可能影响查询时间)
这种方法似乎不是我真正想要的,因为不可能在一本书结构中引用同一篇文章的不同语言的不同版本。此外,子选择似乎严重减慢了整个过程。
有没有什么方法可以表示这种联系并防止任何性能方面的负面影响?
考虑以下问题:有两个表用于结构:一个用于 Current
结构;每当发生变化时都会更新。另一个是结构的History
。
进行更改时,将当前结构从Current
复制到History
,然后修改Current
。
这会减慢插入和更新的速度,但会简化选择。
History
中的多行将指向相同的 Articles
、Users
等。但这没关系。
我目前正在开发一种工具来构建和修改书籍和文章。
- 一本书包含文章并具有特定结构
- 一篇文章可以在同一本书中出现多次
- 它是多语言的,因此每篇文章可以(但不一定)使用不同的语言。 (如果所选语言没有任何数据,只显示通知或类似内容即可)
- 稍后,可能会添加新的语言
- depth/nesting是动态的(一篇文章可以有子文章)
- 文章和结构都必须进行版本控制(我稍后必须能够恢复特定状态)
这是我目前对数据库的处理方法:
有了这个,我可以像这样获取最新版本的书:
SELECT *
FROM books AS b
JOIN structure AS s ON s.book_fk = b.id
AND s.book_version_nr =
(
SELECT MAX(s2.book_version_nr)
FROM structure AS s2
WHERE s2.book_fk = b.id
)
JOIN articles AS a ON a.id = s.article_fk
JOIN article_texts AS as ON as.article_fk = a.id
AND as.version_nr = s.article_version_nr
AND as.language_fk = 'languageIdFromScript'
WHERE b.id = 'bookIdFromScript'
ORDER BY s.position ASC
但是,这意味着:
- 如果我创建文章的新版本,我必须更新最新的结构以反映这一点(但这也意味着我 "lose" 版本因为内容现在已更改)
- 如果我添加、删除或移动一篇文章,我必须为最细微的变化创建一个全新的结构版本(这会导致数据库中的大量数据非常快,并可能影响查询时间)
这种方法似乎不是我真正想要的,因为不可能在一本书结构中引用同一篇文章的不同语言的不同版本。此外,子选择似乎严重减慢了整个过程。
有没有什么方法可以表示这种联系并防止任何性能方面的负面影响?
考虑以下问题:有两个表用于结构:一个用于 Current
结构;每当发生变化时都会更新。另一个是结构的History
。
进行更改时,将当前结构从Current
复制到History
,然后修改Current
。
这会减慢插入和更新的速度,但会简化选择。
History
中的多行将指向相同的 Articles
、Users
等。但这没关系。