【问题标题】:App Engine Data Modeling for Comments用于评论的 App Engine 数据建模
【发布时间】:2017-09-21 18:11:25
【问题描述】:

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

设计 1: 按 groupId 对 cme​​ts 进行分组并过滤这些结果

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

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

Select from Comments filter by groupId

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

Comment Entity >> [id, SELid]

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

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

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

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

【问题讨论】:

    标签: google-app-engine non-relational-database nosql


    【解决方案1】:

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

    注意事项

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

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

    设计 1

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

    设计 2

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

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

    【讨论】:

    • 数据存储表中的条目过多是否存在问题?第一种方法似乎是最简单的,但会创建一个非常大的表。另外,每个数据存储表有几个索引通常可以接受吗?
    • Datastore 使用分布式架构来自动管理扩展到非常大的数据集。它允许应用程序在接收更多流量时保持高性能。索引是为实体的一个或多个属性(组合索引)定义的。每个实体有多个索引是完全可以的。
    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2012-12-20
    相关资源
    最近更新 更多