首页 文章

文档数据库是否适合存储大量Stock Tick数据? [关闭]

提问于
浏览
10

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

数据实际上不是关系数据,而是几个巨大的表格 . 我也在想我可以按分钟/小时/天/周/月等来加/最小/最大行数据,以便进行更快的计算 .

示例数据:500个符号* 60分钟* 60秒* 300天......(每个记录我们存储:日期,开放,高,低,关闭,交易量,开放 - 所有小数/浮点数)

那你觉得怎么样?

4 回答

  • 4

    答案取决于范围 .

    MongoDB是获取数据的好方法,它在查询单个部分时非常快 . 它也很好,因为它是为水平扩展而构建的 .

    但是,您必须记住的是,所有重要的“查询”实际上都来自“批处理作业输出” .

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

    在他们的情况下,他们有一个简单的周期:将数据发布到mongo - >运行map-reduce - >将数据推送到网络以进行实时优化 - >冲洗/重复 .

    这实际上非常接近你可能想做的事情 . 但是,这里有一些限制:

    • Map-reduce对很多人来说都是新的 . 如果你必须接受Map-reduce的学习曲线 .

    • 如果你想要查看slaving / replica对,如果响应时间很重要的话 .

    另一方面,您将遇到SQL的这些问题的不同变体 .

    当然这里有一些好处:

    • 水平可扩展性 . 如果你有很多盒子,那么你可以对它们进行分片,并在Map / Reduce作业上获得一些线性的性能提升(这就是它们的工作方式) . 使用SQL数据库构建这样的"cluster"要昂贵得多且成本高昂 .

    • 速度非常快,与第1点一样,您可以水平添加RAM以保持速度 .

    正如其他人所提到的,您将失去对ETL和其他常用分析工具的访问权限 . 你绝对可以编写很多自己的分析工具 .

  • 0

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

    使用MongoDB或其他面向文档的数据库,如果您的目标是性能,建议是contort your schema来组织以秒为单位的对象中的刻度(或者是分钟对象,每分钟是60秒的另一个对象) . 使用专门的时间序列数据库,您可以简单地使用查询数据

    SELECT open, close FROM market_data
    WHERE symbol = 'AAPL' AND time > '2016-09-14' AND time < '2016-09-21'
    

    我还在考虑我可以按分钟/小时/天/周/月等对每行数据进行求和/最小/最大行数,以便进行更快速的计算 .

    使用InfluxDB,这非常简单 . 以下是如何获得每日最低和最高限额:

    SELECT MIN("close"), MAX("close") FROM "market_data" WHERE WHERE symbol = 'AAPL'
    GROUP BY time(1d)
    

    您可以按时间间隔分组,可以是微秒( u ),秒( s ),分钟( m ),小时( h ),天( d )或周( w ) .

    TL; DR

    时间序列数据库是比面向文档的数据库更好的选择,用于存储和查询大量的股票价格数据 .

  • 4

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

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

    糟糕的是,提取这些数据的选项非常少(如果有的话),并将其塞进一个更适合统计分析的结构中,例如:柱状数据库或多维数据集 . 如果将其加载到基本关系数据库中,则有许多工具,包括商业和开源,如pentaho,可以很好地适应ETL和分析 .

    但最终,您要记住的是,世界上每家金融公司都有一个股票分析/自动交易应用程序;他们刚刚引发了美国主要股票市场萧条,他们不是玩具 . :)

  • 1

    在执行分析合理地超过单个系统容量的情况下,诸如键值或文档数据库之类的简单数据存储也是有益的 . (或者它需要一个特别大的机器来处理负载 . )在这些情况下,使用简单的存储是有意义的,因为分析需要批处理 . 我个人会寻找一种水平缩放处理方法来提出所需的单位/时间分析 .

    我会调查使用基于Hadoop构建的东西进行并行处理 . 要么在Java / C中本地使用框架,要么在更高级别的抽象中使用:Pig,Wukong,通过流接口的二进制可执行文件等 . 如果感兴趣的话,亚马逊提供相当便宜的处理时间和存储 . (我没有个人经验,但很多人为他们的业务做了并依赖它 . )

相关问题