股票价格的数据库建模

6
我最近被分配为建模一个数据库,以存储超过140家公司的股票价格。这些公司的数据将每15分钟收集一次,每天持续8.5小时。我现在面临的问题是如何设置数据库以实现快速搜索/获取这些数据。
一个解决方案是在一个表中存储所有内容,包括以下列:
| Company name | Price | Date | Etc... |

我可以为每个公司创建一个表,仅存储价格和数据收集日期(以及其他目前未知的参数)。您对这种解决方案有何想法?希望问题已经被充分解释,如果还有需要,请告诉我。任何其他解决方案都将不胜感激!
5个回答

8
我猜您关心性能问题,因为您可能会生成大量记录 - 140家公司*每小时4个数据点*8.5小时*每年250个交易日,这意味着您每年需要处理约120万个数据点。

现代关系型数据库系统可以轻松处理该记录数 - 前提是需要考虑一些重要问题 - 在单个表中,我认为存储100年的数据点没有问题。

所以,是的,您最初的设计可能是最好的:

公司名称|价格|日期|等等...|

在公司名称和日期上创建索引;这将使您能够回答以下问题:

  • 公司x的最高股价是多少?
  • 公司x在y日期的股票价格是多少?
  • 在y日期,最高的股票价格是多少?

为了避免性能问题,我建议建立一个测试数据库,并使用示例数据填充它(像dbMonster这样的工具可以轻松完成),然后构建您将针对实际系统运行的查询;使用数据库系统的调整工具来优化这些查询和/或索引。


谢谢,这让我有了很好的启示。 - RobertH

8
除了已经说过的内容外,我想要说的是:不要将“公司名称”或类似“股票代码”作为你的主键。正如你可能会发现的那样,股票价格有两个重要特征经常被忽略:
一些公司可能在多个证券交易所上市,因此在每个证券交易所上有不同的报价价格; 有些公司在同一个证券交易所上以不同货币进行多次报价。
因此,一个合适的通用解决方案应该使用(ISIN, 通货, 证券交易所)三元组作为报价的唯一标识符。

5
首先,更重要的问题是针对这个表将执行哪些类型和使用模式的查询。这是一个在线事务处理(OLTP)应用程序吗?在这种情况下,绝大多数查询是否针对单个记录或最多一小组记录?还是在线分析处理(OLAP)应用程序?在这种情况下,大多数查询将需要读取和处理大量数据集以生成聚合并进行分析。这两种非常不同的系统应该以不同的方式建模。
如果它是第一种类型的应用程序(OLTP),则第一个选项更好,但仍然需要确定索引类型以放置在表上的查询类型和使用模式。
如果它是一个OLAP应用程序(而存储数十亿股票价格的系统似乎更像是一个OLAP应用程序),那么您设置的数据结构可能更好地组织起来存储预聚合的数据值,甚至可以使用基于星型模式的多维数据库,如OLAP立方体

3

将它们放入单个表中。现代数据库引擎可以轻松处理您指定的数据量。

rowid | StockCode股票代码 | priceTimeInUTC时间戳 | PriceCode价格代码 | AskPrice买入价 | BidPrice卖出价 | Volume成交量

  • rowid:唯一标识符。
  • StockCode股票代码代替公司名称。公司有多种类型的股票。
  • priceTimeInUTC是为了将任何日期时间标准化到特定时区。
  • 还可以使用datetime2(更精确)。
  • PriceCode用于标识它是哪种价格:期权/期货/普通股票、优先股等。
  • AskPrice是购买价格。
  • BidPrice是出售价格。
  • Volume(买入/卖出)对您可能有用。

另外,需要有一个StockCode表和一个PriceCode表。


-2

这是一种蛮力方法。一旦添加了可搜索的因素,就可能改变一切。更灵活、更优雅的选择是星型模式,它可以扩展到任意数量的数据。我是一个私人方面正在自己处理这个问题。


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