文档数据库适合存储大量的股票tick数据吗?

11
我在考虑使用像mongodb或ravendb这样的数据库来存储大量的股票交易数据,并想知道相比于标准的关系型数据库如Sql Server是否可行。
这些数据实际上并不具备关系性,将被存储在几个庞大的表中。我还在考虑能否按分钟/小时/日/周/月等统计数据的总和、最小值和最大值,以便进行更快速的计算。
示例数据: 500个符号* 60分钟* 60秒* 300天... (每条记录我们存储:日期、开盘价、最高价、最低价、收盘价、成交量、持仓量-所有十进制/浮点数)
那么你们认为呢?
4个回答

10

自2010年此问题被提出以来,已经发布或开发了多个数据库引擎,其中包括专门处理时间序列(例如股票tick数据)的功能:

对于MongoDB或其他文档导向的数据库,如果你追求性能,则建议 扭曲数据模型,将ticks组织成以秒为键的对象(或每分钟一个对象,每个分钟另一个对象有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)。

简短总结

与文档导向数据库相比,时序数据库更适合存储和查询大量的股票交易数据。


你能提供一些关于所谓的“时间序列数据库”的资源吗?我应该理解像HBase或Cassandra这样的列式数据库吗?谢谢。 - bAN
@bAN:引用这篇关于顶级TSDBS的帖子中的话:“从头开始构建的时间序列数据数据库比那些基于非专用数据库(如Cassandra和Hadoop)的数据库要快得多。” - Dan Dascalescu
@DanDascalescu,您的评论链接已经失效。 - Joseph Garvin
1
@JosephGarvin:幸运的是,Wayback Machine已经存档了它 - Dan Dascalescu

4
这里的答案取决于范围。
MongoDB是获取数据的好方法,并且在查询单个数据时非常快。它也很好用,因为它可以水平扩展。
但是,你需要记住的是,所有重要的“查询”实际上都将来自“批处理作业输出”。
例如,Gilt Groupe创建了一个名为Hummingbird的系统,用于其网站的实时分析。演示here。他们基本上根据紧密间隔(15分钟)收集的性能数据动态呈现页面。
在他们的情况下,他们有一个简单的周期:将数据发布到mongo -> 运行map-reduce -> 将数据推送到webs以进行实时优化 -> 冲洗/重复。
说实话,这与您可能想做的非常接近。但是,这里有一些限制:
  1. Map-reduce对许多人来说是新的。如果您熟悉SQL,则必须接受Map-reduce的学习曲线。
  2. 如果您正在输入大量数据,则这些盒子上的map-reduce将变慢。如果响应时间很重要,您可能需要查看从属/副本对。

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

当然,这里有一些好处:

  1. 水平可扩展性。如果您有很多盒子,那么您可以将它们分片并在Map/Reduce作业上获得相对线性的性能增长(这就是它们的工作原理)。使用SQL数据库构建这样的“集群”成本更高。
  2. 速度非常快,并且与第1点一样,您可以添加RAM以保持速度。

正如其他人所提到的,您将失去访问ETL和其他常见分析工具的权限。您肯定需要编写很多自己的分析工具。


谢谢回复,看来我得先做几个测试场景然后再尝试一下。不过分析工具的支持是我忽略了的,谢谢。 - dvkwong

1

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

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

糟糕的是,几乎没有任何选项可以提取此数据并将其压缩到更适合统计分析的结构中,例如列式数据库或立方体。如果将其加载到基本关系数据库中,则有许多工具,包括商业和开源工具,例如pentaho,可以很好地容纳ETL和分析。

但最终,您要记住的是,世界上每家金融公司都有股票分析/自动交易应用程序;他们刚刚引起了美国股市的重大动荡,它们不是玩具。 :)


0

在进行分析超出单个系统容量的情况下,使用简单的数据存储,如键值或文档数据库也是有益的。(否则需要一个异常大的机器来处理负载。)在这些情况下,使用简单的存储是有意义的,因为分析需要批处理。我个人会考虑找到一种横向扩展的处理方法来满足单位/时间分析的要求。

我会研究使用基于Hadoop的并行处理。可以原生地在Java/C++中使用该框架,或者使用一些更高级别的抽象:Pig、Wukong、通过流接口的二进制可执行文件等。如果感兴趣,亚马逊提供了相对便宜的处理时间和存储空间。(我没有个人经验,但许多人依赖它来开展业务。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接