【问题标题】:Tag management in App Engine Datastore?App Engine Datastore 中的标签管理?
【发布时间】: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


【解决方案1】:

我同意@Nick。

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

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

【讨论】:

  • 我同意这一点。他还回答了你的两个问题
  • 您好@user2024780,感谢您的回复。您对我对该问题的更新(参见“跟进 - 通过关系索引进行数据查找”)有何看法?很高兴知道您没有遇到任何问题。
  • @AtariPete,我之前没有在 NDB 中实现过类似的东西,但对我来说看起来没问题,因为如果标签与 Foo 是一个,它们几乎喜欢具有相同的底层查询结构。唯一的区别是您有 2 个查询。而且你有更多的 TagStore 实体。在这种情况下,您将有更多的操作,用于写入而不是太多的读取操作(如果这是一个问题,请在Cost for Datastore Calls 上阅读更多内容),但除此之外,如果我没记错的话,我认为没关系。跨度>
  • 再想一想,也许您还有更多的读取操作,因为您必须通过 TagStore 获取的实体进行迭代。但如果没关系,结构对你来说最重要,那没关系。
【解决方案2】:

你描述的具体情况就可以了。当您开始对其他属性进行过滤或排序时,索引将开始失控。

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

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

如果您希望用户切片和切块(即标准的高级搜索 UI),您应该寻找替代方案。唯一可行的 appengine 托管解决方案是搜索服务和 cloudsql。之后,您将看到类似 GCE 上的托管弹性搜索或类似替代方案。

【讨论】:

  • 嗨@Nick,感谢您的回复。您对我对问题的编辑更新有何看法(请参阅“跟进 - 通过关系索引进行数据查找”)?理想情况下,我们可能希望通过以下方式进行搜索:标签、日期时间和另一个内部分类(类似 type="animal")。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2014-03-12
相关资源
最近更新 更多