文档可能很大时的 Couchbase 模型
Couchbase model when document can be huge
我们正在尝试找出当文档大小可能变得非常大时哪种数据模型最适合将数据保存到 Couchbase。
将所有数据保存在一个文档中,可能会出现达到 Couchbase 允许的最大值的问题 (https://docs.couchbase.com/server/current/learn/clusters-and-availability/size-limitations.html)。文档的结构类似于:
{
"id": "x",
"name": "Test 1",
"tokens": [
{
"value": "bad words 1",
"caseSensitive": true,
"whole": true
},
{
"value": "bad words 10",
"caseSensitive": true,
"whole": true
},
[...]
],
"_class": "Document"
}
以parent文档的id作为主索引保存到多个文档,所以我们可以通过parentId:
查询ChildDocuments
Parent:
{
"id": "x",
"name": "Test 1",
"_class": "ParentDocument"
}
Children:
{
"id": "y",
"parentId": "x",
"value" "value",
"caseSensitive": true,
"whole": true,
"_class": "ChildDocument"
}
由于数据库管理员告诉我们由于索引的大小和性能而添加索引不是一个好的做法,因此单个文档选项似乎是唯一的选择,但是可以做些什么来避免达到最大大小Couchbase可以支持吗?
提前致谢
我认为这最终会归结为 trade-offs / 意见甚至基准。但这里是我要开始的地方:parent 包含一组 children 文档 ID 的文档。例如
parent (id: 1)
{
"name" : "Parent 1",
"foo" : "bar",
"children" : ["100","101"]
}
child (id: 100)
{
"name" : "Child 1",
"baz" : "qux"
}
child (id: 101)
{
"name" : "Child 2",
"zip" : "zap"
}
// ... and so on ...
在这种情况下,一旦您获取了 parent,您就可以通过 key/value 操作获取(部分?全部?)children。
如果 children 的列表变得非常长以至于导致 parent 文档超过文档大小限制(在 Couchbase 中为 20 mb),那么您可以将其拆分为多个文档。只是一个 back-of-the-envelope 例子:
parent (id: 1)
{
"name" : "Parent 1",
"foo" : "bar",
"children" : ["100","101"],
"childrenArchiveId" : "parent1::archive1"
}
parent archive 2 (id: parent1::archive1)
{
"children" : ["9999998", "9999999"]
}
如果真的有那么多 children,希望您不需要获取所有这些(如果您这样做,很可能会遇到很多其他问题)。也许您需要的只是最新的或最活跃的?一旦达到 20mb 的阈值,您可以将不太活跃的文件存储在“存档”文档中,这是一个单独的辅助 parent 文档。
但我认为 20mb 允许您存储 吨 的 children ID(如果您将它们存储为整数而不是字符串,假设这是可能的,甚至更多)。
您可能想出一个更适合您的用例的存档策略(例如,也许每年一个新的“parent”文档?)。
我们正在尝试找出当文档大小可能变得非常大时哪种数据模型最适合将数据保存到 Couchbase。
将所有数据保存在一个文档中,可能会出现达到 Couchbase 允许的最大值的问题 (https://docs.couchbase.com/server/current/learn/clusters-and-availability/size-limitations.html)。文档的结构类似于:
{
"id": "x",
"name": "Test 1",
"tokens": [
{
"value": "bad words 1",
"caseSensitive": true,
"whole": true
},
{
"value": "bad words 10",
"caseSensitive": true,
"whole": true
},
[...]
],
"_class": "Document"
}
以parent文档的id作为主索引保存到多个文档,所以我们可以通过parentId:
查询ChildDocumentsParent:
{
"id": "x",
"name": "Test 1",
"_class": "ParentDocument"
}
Children:
{
"id": "y",
"parentId": "x",
"value" "value",
"caseSensitive": true,
"whole": true,
"_class": "ChildDocument"
}
由于数据库管理员告诉我们由于索引的大小和性能而添加索引不是一个好的做法,因此单个文档选项似乎是唯一的选择,但是可以做些什么来避免达到最大大小Couchbase可以支持吗?
提前致谢
我认为这最终会归结为 trade-offs / 意见甚至基准。但这里是我要开始的地方:parent 包含一组 children 文档 ID 的文档。例如
parent (id: 1)
{
"name" : "Parent 1",
"foo" : "bar",
"children" : ["100","101"]
}
child (id: 100)
{
"name" : "Child 1",
"baz" : "qux"
}
child (id: 101)
{
"name" : "Child 2",
"zip" : "zap"
}
// ... and so on ...
在这种情况下,一旦您获取了 parent,您就可以通过 key/value 操作获取(部分?全部?)children。
如果 children 的列表变得非常长以至于导致 parent 文档超过文档大小限制(在 Couchbase 中为 20 mb),那么您可以将其拆分为多个文档。只是一个 back-of-the-envelope 例子:
parent (id: 1)
{
"name" : "Parent 1",
"foo" : "bar",
"children" : ["100","101"],
"childrenArchiveId" : "parent1::archive1"
}
parent archive 2 (id: parent1::archive1)
{
"children" : ["9999998", "9999999"]
}
如果真的有那么多 children,希望您不需要获取所有这些(如果您这样做,很可能会遇到很多其他问题)。也许您需要的只是最新的或最活跃的?一旦达到 20mb 的阈值,您可以将不太活跃的文件存储在“存档”文档中,这是一个单独的辅助 parent 文档。
但我认为 20mb 允许您存储 吨 的 children ID(如果您将它们存储为整数而不是字符串,假设这是可能的,甚至更多)。
您可能想出一个更适合您的用例的存档策略(例如,也许每年一个新的“parent”文档?)。