6

我想存储 1000 个符号的股票交易数据。数据实际上是从文本文件转换的,因此不需要插入和更新;只需要只读访问权限。

数据基本上是这样分组的:每个品种有很多记录:{timestamp, price, quantity},每条记录代表一个交易。

一个符号的近似数据上限是 5 条记录/秒,每个工作日 8 小时,即每天 5x60x60x8 = 144K。即 1K 符号每天将生成 144M 记录。

对数据的大多数操作将类似于:

  • 给我日期 D1,时间 T1 到日期 D2,时间 T2 期间的符号的所有记录
  • 查找期间 [D1, T1...D2, T2] 的最小/最大/平均价格或数量

现在的问题是:在这种情况下,数据库的最佳设计是什么?

  • 我可以将所有交易品种存储在一个表中吗?不过,在这种情况下,表格很快就会变得太大。
  • 我应该每天/每周/每月创建一个单独的表吗?即 2013-10-25_ABC(ABC - 符号名称)。在这种情况下,我们每天/每周/每月可能会获得 1K 个新表。
  • 或者,在这种情况下纯文本文件就足够了吗?例如,将所有符号数据作为 2013-10-15 文件夹下的文件,导致每个文件夹中有 1K 个文件

数据库可以是 MS SQL 或 MySQL。总时间段 - 长达5年。谢谢!

4

3 回答 3

4

That's a whole lot of data. Do look at NoSQl.

Using SQL, here are some basic ideas:

Put all price data in a table, using as small data types as possible. Use a SymbolId (int) to reference the symbol, the smallest datetime type needed, the smallest monetary type needed.

Do denormalize. Make a second table with min/max/avg per day and SymbolId.

Research horizontal partitioning and use indexes.

于 2013-10-31T20:13:23.127 回答
4

第三种选择是最好的 1. 您需要几乎可以忽略不计写入的高读取性能。

您的要求最适合 NoSql 数据库。没有关系的单表;MySQL 将是矫枉过正。更多信息 --> NoSql 数据库

于 2013-10-29T10:45:21.147 回答
3

由于您将运行从一个日期时间到另一个日期时间的查询,因此我根本不会拆分表。相反,请了解有关分片的更多信息。以下是我将使用的架构:

symbols
    id          varchar(6) // MSFT, GOOG, etc.
    name        varchar(50) // Microsoft, Google, etc.
    ...

trades
    id              unsigned bigint(P)
    symbol_id       varchar(6)(F symbols.id)
    qwhen           datetime
    price           double
    quantity        double
    ...
于 2013-10-29T16:47:46.880 回答