Mongodb 文档数据库是否适合存储大量股票行情数据?

Mongodb 文档数据库是否适合存储大量股票行情数据?,mongodb,ravendb,document,stocks,database,Mongodb,Ravendb,Document,Stocks,Database,我曾考虑使用mongodb或ravendb之类的数据库来存储大量股票行情数据,并想知道与标准关系数据库(如Sql Server)相比,这是否可行 数据不是真正的关系型数据,而是两个巨大的表。我还认为我可以按分钟/小时/天/周/月等对数据行进行求和/最小/最大,以实现更快的计算 示例数据: 500符号*60分钟*60秒*300天。。。(我们存储的每条记录:日期、打开、高、低、关闭、音量、打开整数-所有十进制/浮点) 你们觉得呢?这是我对这个想法的保留意见——我要公开承认,我对文档数据库的工作知识很

我曾考虑使用mongodb或ravendb之类的数据库来存储大量股票行情数据,并想知道与标准关系数据库(如Sql Server)相比,这是否可行

数据不是真正的关系型数据,而是两个巨大的表。我还认为我可以按分钟/小时/天/周/月等对数据行进行求和/最小/最大,以实现更快的计算

示例数据: 500符号*60分钟*60秒*300天。。。(我们存储的每条记录:日期、打开、高、低、关闭、音量、打开整数-所有十进制/浮点)


你们觉得呢?

这是我对这个想法的保留意见——我要公开承认,我对文档数据库的工作知识很薄弱。我假设您希望存储所有这些数据,以便可以对其执行一些聚合或基于趋势的分析

如果使用基于文档的数据库作为源,则每行数据的加载和操作(CRUD操作)都非常简单。非常高效,非常直截了当,基本上很可爱

糟糕的是,提取这些数据并将其填充到更适合统计分析的结构(如柱状数据库或多维数据集)的选项非常少(如果有的话)。如果您将其加载到一个基本的关系数据库中,就会有大量的工具,包括商业工具和开源工具,这些工具将很好地适应ETL和分析


但最终,你要记住的是,世界上每一家金融公司都有一个股票分析/自动交易员应用程序;它们只是导致了美国股市的大幅下跌,它们不是玩具

一个简单的数据存储,如键值或文档数据库,在执行分析合理地超过单个系统容量的情况下也是有益的。(或者需要一台非常大的机器来处理负载。)在这些情况下,使用简单的存储是有意义的,因为分析无论如何都需要批处理。我个人会考虑寻找一种水平缩放处理方法,以提供所需的单位/时间分析


我将研究使用基于Hadoop的东西进行并行处理。可以在Java/C++中使用本机框架,也可以使用更高级别的抽象:Pig、Wukong、通过流接口的二进制可执行文件等。如果感兴趣的话,Amazon提供了相当便宜的处理时间和存储。(我没有个人经验,但很多人都有,他们的业务依赖于此。)

这里的答案取决于范围

MongoDB是一种很好的获取数据的方法,它在查询单个数据块时非常快。它也很好,因为它是建立在横向规模

然而,您必须记住的是,所有重要的“查询”实际上都是“批处理作业输出”的结果

例如,Gilt Groupe创建了一个名为的系统,用于在其网站上进行实时分析。演示它们基本上是基于收集的性能数据以很短的间隔(15分钟)动态呈现页面

在他们的例子中,他们有一个简单的循环:将数据发布到mongo->运行map reduce->将数据推送到Web以进行实时优化->清洗/重复

这与你可能想做的事情非常接近。但是,这里有一些限制:

  • 地图还原对许多人来说是新的。如果您熟悉SQL,则必须接受Map reduce的学习曲线
  • 如果你输入了大量的数据,你的地图在这些盒子上会变慢。如果响应时间很重要,您可能会想看看从属/副本对
  • 另一方面,您将在SQL中遇到这些问题的不同变体

    当然,这里有一些好处:

  • 横向可伸缩性。如果你有很多盒子,那么你可以将它们切分,并在Map/Reduce作业上获得一些线性性能提升(这就是它们的工作方式)。使用SQL数据库构建这样一个“集群”的成本和成本要高得多
  • 速度非常快,与第1点一样,您可以水平添加RAM以保持速度

  • 正如其他人所提到的,您将无法访问ETL和其他常见的分析工具。你肯定会编写很多自己的分析工具。

    自从2010年提出这个问题以来,几个数据库引擎已经发布,或者已经开发出专门处理时间序列的功能,例如股票行情数据:

    对于MongoDB或其他面向文档的数据库,如果您以性能为目标,建议您在以秒为键的对象(或以分钟为键的对象,每分钟为另一个60秒的对象)中组织记号。有了专门的时间序列数据库,您只需使用

    SELECT open, close FROM market_data
    WHERE symbol = 'AAPL' AND time > '2016-09-14' AND time < '2016-09-21'
    
    您可以按时间间隔进行分组,时间间隔可以是微秒(
    u
    )、秒(
    s
    )、分钟(
    m
    )、小时(
    h
    )、天(
    d
    )或周(
    w

    TL;博士
    与面向文档的数据库相比,时间序列数据库是存储和查询大量股票行情数据的更好选择。

    感谢您的回复,看起来我需要先做一些测试场景和尝试。但是分析工具的支持是我忽略了的。谢谢。你能提供一些关于你所谓的“时间序列数据库”的资源吗?我应该理解像HBase或cassandra这样的面向列的数据库吗?Tx@bAN:引用“为时间序列数据从头构建的数据库要比那些位于非专用构建数据库(如Cassandra和Hadoop)之上的数据库快得多。”@DanDascalescu您的评论链接broke@JosephGarvin当前位置幸运的是,回程机器已经启动。
    SELECT MIN("close"), MAX("close") FROM "market_data" WHERE WHERE symbol = 'AAPL'
    GROUP BY time(1d)