0

我为我当前的应用程序实现了一个评论部分。评论部分可以被认为是给定页面上的一系列用户帖子。我想知道哪种设计在非关系数据库(Google App Engine)中最有效。

设计 1: 按 groupId 对评论进行分组并过滤这些结果

Comment Entity >> [id, groupId, otherData...]

与页面相关的所有评论的查询如下所示:

Select from Comments filter by groupId

设计 2: 为组内的所有评论存储一个键,如果条目数超过 5000 个条目,则使用自扩展列表。

Comment Entity >> [id, SELid]

查询将简单地执行 id/key 查找。

我知道索引可能很昂贵,但第一个设计提案只会索引 groupId 字段,并且只需要一次写入即可发表评论(如果包含索引,则写入更多)。

第二种设计将避免昂贵的索引,但每个发布的评论都需要读取和写入操作。此外,我担心争用问题。这些评论不应该经历极高的吞吐量,但第二种设计似乎会造成瓶颈。

由于我是非关系数据库的新手,因此我将不胜感激有关这些提议的设计及其相关权衡的任何意见。

4

1 回答 1

1

对于 App Engine 和 Datastore,您将采用的方法主要取决于您的实体所需的一致性模型(强与最终)。在 Google Cloud Datastore 中,存在实体组的概念。实体组(一个实体及其后代)是一个具有强一致性、事务性和局部性的单元,但也施加了一些限制(每秒 1 次写入)。

注意事项

  1. 您需要强大的一致结果吗?
  2. 每页多久发布一次评论?
  3. 您希望每页有多少评论?
  4. 您是否有需要事务行为的用例?

由于您的设计选项都没有使用实体组(页面-> 帖子),我想您决定不这样做。

设计一

  1. groupId 的最终一致性查找
  2. 更易于维护(您不必处理 5000 个实体的限制)

设计二

  1. entityGroupId 的强一致性查找
  2. 更难维护(你必须处理 5000 个实体的限制)
  3. 如前所述,一个代表页面所有帖子的实体可能是瓶颈(可以通过 Memcache 减少)

我可能会采用第一种方法,即使它可能类似于关系数据模型。

于 2014-07-12T18:53:57.610 回答