【发布时间】:2016-02-17 09:08:51
【问题描述】:
情况:我计划为 Datastore 中的一组对象提供标签支持。这些标签是可搜索的,所以它们必须被索引。我最担心的当然是指数爆炸。
以下情况是否可能导致索引爆炸:
- Datastore 对象 Foo 有一个 tags 属性。通常 Foo 最多会分配 5-8 个标签。
- 最多有一组已知的 80 个标签。 Foo 将仅包含这组 80 个标签中的标签。
- 在任何给定时间,数据存储中都会存在大约 100,000 个 foo 元素。
问题 1: 我主要是想完全了解我们的标签索引可能会变得多么爆炸性。上述情况会不会导致一个非常爆炸性的指数?
问题 2: 是否有任何推荐的最佳实践来管理 Datastore 中的标签?
跟进 - 通过关系索引查找数据 作为对象内标签的替代方案,如果有一个单独的标签存储对象,看起来像这样:
TagStore {
private String tag;
private String fooId;
private long timestamp;
}
使用上述方法,考虑以下场景:我们希望将对象 Foo 的实例与标签“cat”、“horse”和“funicular”相关联。在这种情况下,我们创建并保存 Foo 实例并创建并保存 3 个单独的 TagStore 实例,每个 TagStore 实例都有自己的标签并通过其 fooId 指向 Foo。
通过 TagStore 获取 Foo: 要检索标记为“cat”的最近 Foo 实例,您首先要选择:
SELECT TagStore WHERE tag=cat ORDER BY timestamp;
那么,通过 GQL 响应,您可以通过以下方式获取 foo 集
SELECT Foo where Foo.id IN ({Set of foo id's here})
我认为这是一种更结构化的方法,因为您正在准确定义您希望如何管理查找,并且您不会因为任何类型的标签复杂性而使 Foo 对象变得混乱。当然如果每个 Foo 对象有 8 个标签,那么必然存在 8 个相关的 TagStore 对象。
这似乎是简单地标记 Foo 本身的明智选择吗?开销太大了吗?
【问题讨论】:
-
检查我的问题是否正确:您总共有 80 个标签。您有一个 Foo 对象,它将被所有标签的子集标记,每个 Foo 对象主要有 5-8 个标签?
标签: java google-app-engine indexing tags google-cloud-datastore