【问题标题】:Data model advice for Mongo collection that contains complex objects包含复杂对象的 Mongo 集合的数据模型建议
【发布时间】:2013-02-26 21:46:09
【问题描述】:

我们将苹果应用数据存储在数据库中 (http://www.apple.com/itunes/affiliates/resources/documentation/itunes-enterprise-partner-feed.html)。

我们希望针对一种查询进行优化:查找所有满足某些条件的应用。标准:(1)应用的平均评分; (2) 应用评分数量; (3) 应用支持的设备; (4) 应用销售国家; (5) 应用当前价格; (6) 应用程序免费的日期。查询应该尽可能快。示例查询:“查找所有评分超过 600、平均 5 星、支持 iPad 和 iPhone、在美国销售且两天前价格降至 0.00 美元的应用。”

基于 apple 架构,每个国家/地区都有价格信息。假设苹果支持 100 个国家,每个应用程序将有 100 个价格——每个国家一个。我们还需要存储每个应用的历史价格,这意味着具有 10 次价格变化的应用将有 1000 个价格(假设 100 个国家/地区)。

三个问题:

1) 您如何建议我们将价格数据存储在 mongo 中以快速查询?现在,我们正在考虑将价格存储为一个对象数组。每个对象由三个元素组成: (1) 日期; (2) 国家; (3) 价格。

2) 如果我们将价格数据作为对象存储在数组中,我们需要做什么才能非常快速地搜索价格数据。同样,常见的价格搜索类似于“在美国商店中查找所有在 2 天内再次将价格降至 0.00 美元的应用程序。”

3) 在存储数据时我们应该注意哪些问题?

【问题讨论】:

    标签: mongodb data-modeling mlab mongohq database


    【解决方案1】:

    就个人而言,我会单独收集每日价格数据——每个应用程序每天 1 条记录(复合自然键),该应用程序当天包含 100 个数字。这样,记录将永远不需要增长或重新定位——这是一个巨大的胜利。使用适当的索引,大多数针对此集合的查询都可以很好地执行。保持较小的字段名称以提高存储效率。

    我会为应用程序“主数据”保留一个单独的集合——每个应用程序 1 条记录。在这些记录中,您可以记住应用程序最近免费发布的日期、最近按国家/地区价格向量的快照,以及可能构成应用程序搜索选择标准的任何其他“摘要”数据的类似快照值。聚合计算和记录这些值,如果它们可能变得昂贵,可以在方便的时候在后台执行。

    希望对您有所帮助!太好了,你提前问了这些问题。 :)

    【讨论】:

    • 谢谢!如果我们将价格数据存储在单独的字段中,我们会不会损失很多 mongo 的功能和速度?我们的理解是,mongo 需要数据存在于一个集合中才能达到最佳状态。
    • 我不这么认为。这一切都是为了优化您预期的访问模式......最重要的原则是:避免任何闻起来像关系连接的东西,尤其是响应每个最终用户的请求。根据您的描述,听起来摘要数据足以满足大多数查询;最好一次允许尽可能多的页面放入 RAM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多