App Engine数据存储区中的代码管理?

时间:2016-02-17 09:08:51

标签: java google-app-engine indexing tags google-cloud-datastore

情况:我计划为数据存储区中的一组对象提供标记支持。标签应该是可搜索的,因此必须对它们编制索引。我最担心的当然是爆炸指数。

以下情况是否可能导致索引爆炸:

  • 数据存储对象Foo有一个标签属性。通常,Foo最多会分配5-8个标签。
  • 最多有一组已知的80个标签。 Foo将只包含这组80中的标签。
    • 在任何给定时间内,数据存储中将存在大约100,000个foo元素。

问题1:我主要是试图完全理解我们的标签索引可能会变得多么具有爆炸性。上述情况是否会导致一个非常爆炸性的指数?

问题2:是否有任何建议的最佳做法来管理数据存储区中的标记?

跟进 - 通过关系索引进行数据查找 作为对象中标记的替代,如何使用单独的标记存储对象,如下所示:

TagStore {
    private String tag;
    private String fooId;
    private long timestamp; 
}

使用上述方法,请考虑以下场景:我们希望将对象Foo的实例与标签" cat"," horse"和" funicular&#相关联34 ;.在这种情况下,我们创建并保存Foo实例并创建并保存3个单独的TagStore实例,每个TagStore实例都有自己的标记,并通过其fooId指向Foo。

通过TagStore获取Foo: 用于检索最近被标记的Foo实例" cat"你首先要选择:

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本身的明智选择吗?这太多开销了吗?

2 个答案:

答案 0 :(得分:2)

我同意@Nick。

如果您使用重复属性作为标记,则5-8个标记已经足够有效。只是避免在一个属性/实体中存储100多个标签。 100,000个实体是可以的,因为数据存储区使用索引。

我已经在许多项目上使用过这种方法,并且没有任何问题。所以你很高兴。

答案 1 :(得分:1)

您描述的具体情况会很好。当您开始过滤或订购其他属性时,索引将开始失控。

例如,查找由创建日期升序排序的特定用户创建的所有foo将需要新索引,如果要降序,则需要另一个索引。

考虑您需要提供的基本搜索和排序排列 - 您应该假设每个排序都需要自己的索引。因此,如果只是通过一次订购进行搜索,那么您就可以了。

如果您希望用户切片和切块(即标准高级搜索UI),您应该考虑另一种选择。唯一可行的appengine托管解决方案是搜索服务和cloudsql。在此之后,您会在GCE或类似替代方案上查看托管弹性搜索等内容。