【问题标题】:Help needed with db structure数据库结构需要帮助
【发布时间】:2011-01-06 09:02:04
【问题描述】:

我正在开发一个使用股票数据的网络应用程序。股票数据可以存储在:

  1. 文件
  2. 数据库

数据的结构很简单:有每日集和每周集。如果使用文件,那么我可以为每个符号/集存储一个文件,例如 GOOGLE_DAILY 和 GOOGLE_WEEKLY。每组都包含一个简单的(日期、开盘/最高/最低/收盘、交易量、股息)字段列表。

但是我怎样才能用 DB 做到这一点?我应该使用关系数据库还是其他数据库?我曾想过每个符号使用 2 个表,但那样会生成数千个表,感觉不对。

谢谢。

【问题讨论】:

    标签: python django data-structures


    【解决方案1】:

    您不需要为每个股票代码创建一个表格,您只需要将表格中的一个字段作为股票代码。该表可能称为StockPrices,其字段可能是

    • ticker_symbol - 股票代码
    • time - 股票报价时间
    • price - 股票当时的价格

    只要ticker_symbol 是一个索引字段,你就可以像SELECT time,price FROM StockPrices WHERE ticker_symbol='GOOG' ORDER BY time DESC 这样强大的查询,它们会非常高效。您还可以在此表中存储任意数量的符号。

    您可以为股息、数量信息等添加其他表格。在所有情况下,您都可能拥有ticker_symboltime 的组合键。

    【讨论】:

    • 在这种情况下,表会变得非常非常大。例如,我现在有我需要的部分数据的文本文件,这个集合是 ~164MB。考虑到DB中的数据存储效率更高,它仍然会使一张表在几十兆的数量级。对于 MySQL 等数据库来说,这会是一个问题吗?
    • 不,164Mb 不是问题。在我的工作中,我们有一个大约 20 亿行的表,总 DB 大小为 500+ GB。此外,理论上,这些表可以在一组机器上进行分区,因为您所做的查询可能倾向于处理单个股票代码。 Oracle 和 MySQL 等数据库都支持这些东西。
    • MySql 仅受操作系统文件的最大大小限制:dev.mysql.com/doc/refman/5.0/en/full-table.html
    • 这会影响查询速度吗?
    • 您的查询全部由股票代码索引。该指数实际上是所有股票代码的有序列表。查找给定符号的数据开始是通过索引进行的二进制搜索。二进制搜索是 O(lg n),所以如果你有十亿个条目,大约是 30 次迭代。该索引也将非常紧凑,仅按不同股票代码数量的顺序增加大小。
    【解决方案2】:
    Make two tables:
    

    DAILY_STOCK_DATA

    DATETIME Date
    CHAR(5)  Symbol #or whatever the max symbol length can be
    INTEGER  Open
    INTEGER  High
    INTEGER  Low
    INTEGER  Close
    INTEGER  Volume
    INTEGER  Dividend
    

    假设每周数据是 7 天的平均值? :

    WEEKLY_STOCK_DATA

    DATETIME Date  #date when the week started
    CHAR(5)  Symbol #or whatever the max symbol length can be
    INTEGER  AvgOpen
    INTEGER  AvgHigh
    INTEGER  AvgLow
    INTEGER  AvgClose
    INTEGER  AvgVolume
    INTEGER  AvgDividend
    

    注意:所有的 Open、Close 等都是整数。那是因为它们旨在存储 以最低货币造币(例如美分)表示的值,而不是存储浮动数据。

    【讨论】: