【发布时间】:2018-04-03 07:38:24
【问题描述】:
我有一个 mongodb 数据库,其集合文档大致如下:
// book document
{
_id: $oid,
userId: "..."
name: "name",
description: "description"
status: "draft"
// ...
}
// page document
{
_id: $oid,
bookId: "..."
name: "name",
description: "description"
// ...
}
一本书可以有数千页。每本书都有一个status 属性,该属性可以是“草稿”、“已发布”或“已归档”状态之一。
可以从任何其他书籍创建“草稿”书籍,例如具有“草稿”、“已发布”或“存档”状态。
每次创建新草稿时,都会创建一个与原书具有所有相同页面的新书文档。
任何“草稿”书籍及其所有页面都可以独立于原始书籍及其页面进行编辑。这意味着对新草稿书或其任何页面的任何编辑都不会影响原书或其页面。
在设计中,应优先考虑书籍查询性能而不是草稿创建性能,即查询具有所有(分页)页面的书籍是最高性能优先级。
实现上述要求的最佳方法是什么?在此阶段,可以对数据库模式进行任何修改。
这些是我考虑过的选项:
只要从现有书籍创建新草稿,就可以克隆整本书及其所有页面。这将提供干净的草稿,可以通过简单的
find以最快的方式对其整体进行独立编辑和查询。不利的一面是,page集合的大小会随着草稿数量的增加而迅速增长,并且克隆书中的大部分页面将与原书中的版本完全相同。此外,草稿创建时间会随着书的页数成比例增长。将
parentId属性添加到book文档以引用原始book并重用父级中所有未修改的页面。每次编辑页面时,都会克隆一个新页面,并将bookId设置为新草稿的 id。这种方法将重用大部分page文档,但查询草稿书会更加复杂,因为我们需要遵循parentId链来查找所有修改过的页面和属于所有父书的所有页面(草稿可以是多次创建不同的草稿)。草稿创建会非常快(只需克隆一本书),但查询时间会随着草稿的父级数量成比例增长。此外,当查询一个页面在不同父级中编辑过的草稿时,我们需要过滤掉所有旧页面版本,只保留链中的最新版本。
【问题讨论】:
标签: mongodb database-design nosql database-versioning