【问题标题】:What is the best way to store column oriented table in MongoDB for optimal query of data在 MongoDB 中存储面向列的表以优化数据查询的最佳方法是什么
【发布时间】:2015-09-16 01:30:06
【问题描述】:

我有一个大表,其中的列是 user_id、user_feature_1、user_feature_2、....、user_feature_n

所以每一行对应一个用户和他或她的特征。

我通过将每列的值存储为数组来将此表存储在 MongoDB 中,例如

{
   'name': 'user_feature_1',
   'values': [
   15,
   10,
   ...
   ]
}

我正在使用 Meteor 从 MongoDB 中提取数据,这种存储方式有助于快速轻松地检索整个列的值以进行绘图。

但是,这种存储方式有一个很大的缺点;我无法存储大于 16mb 的数组。

有几个可能的解决方案,但似乎都不够好:

  1. 使用 gridFS 存储每列的值。我不确定meteor是否支持gridFS,并且它缺乏对数据切片的支持,也就是说,我可能只需要获取一列的前1000个值。

  2. 以面向行的格式存储表格。例如

    { 'user_id': 1, 'user_feature_1': 10, 'user_feature_2':0.9,
    …… 'user_feature_n':42 }

但我认为这种存储数据的方式对于查询特征列的值来说效率低下

或者MongoDB根本不适合而sql是要走的路?但是Meteor不支持sql

更新 1: 我发现这篇关于 mongodb 中数组的有趣文章效率低下。 https://www.mongosoup.de/blog-entry/Storing-Large-Lists-In-MongoDB.html

以下解释来自http://bsonspec.org/spec.html

Array - 数组的文档是一个普通的 BSON 文档,键为整数值,从 0 开始并按顺序继续。例如,数组 ['red', 'blue'] 将被编码为文档 {'0': 'red', '1': 'blue'}。键必须按数字升序排列。

这意味着我们可以在一个文档中最多存储 100 万个值,如果值和键是浮点类型(16mb/128 位)

【问题讨论】:

  • “似乎足够好”,“我认为”,...性能不是关于感觉或意见,而是关于基准和配置文件。你的呢?

标签: mongodb meteor


【解决方案1】:

还有第三种选择。每个用户和功能的单独文档:

{ u:"1", f:"user_feature_1", v:10 },
{ u:"1", f:"user_feature_2", v:11 },
{ u:"1", f:"user_feature_3", v:52 },
{ u:"2", f:"user_feature_1", v:4  },
{ u:"2", f:"user_feature_2", v:13 },
{ u:"2", f:"user_feature_3", v:12 },

您不会遇到文档增长问题,您可以同时查询“用户 x 的所有值”和“特征 x 的所有值”,而无需访问任何不相关的数据。

【讨论】:

  • 每个值都需要至少两个标识符(user_id 和 user_feature)。这种方法不会占用空间吗?我在考虑同时使用 mongodb 和 postgres 的可能性,刚刚发现有库支持 postgres 的流星
  • @Michael 这肯定不是最节省空间的解决方案。总会有取舍。
【解决方案2】:

16MB / 64bit float = 2,000,000 uncompressed datapoints。什么样的图表需要至少 200 万个点每列???而是尝试:

  • 在 s3 服务器上保存图片
  • 使用像 hadoop 这样的 map-reduce 解决方案(可能是您的最佳选择)
  • 如果当前是浮点数,则将数字减少为小整数
  • 在客户端动态计算数据(如果可能,最好使用)
  • 使用压缩算法,您可以保存子集并插入其余部分

也就是说,在这个用例中,基于文档的数据库将胜过 SQL 数据库,因为 SQL 数据库完全按照 Philipp 的建议进行。无论哪种方式,您都不能向客户端发送多个 16MB 文件,如果客户端不会因为糟糕的用户体验而离开您,那么您将因服务器成本而破产:-)。

【讨论】:

  • 绘图是必需的功能之一,我需要存储所有值以用于其他目的,例如统计计算。
  • 如果你需要完美的分辨率,听起来你应该选择 Philipp 的建议。
猜你喜欢
  • 2021-10-22
  • 2019-10-21
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2020-02-23
  • 2015-08-01
相关资源
最近更新 更多