【问题标题】:Stock price History Database Design股价历史数据库设计
【发布时间】:2014-06-03 13:18:11
【问题描述】:

我需要存储股价历史。以下是要求,

  1. 前 30 天的每小时数据应该可用
  2. 必须保持 10 年的历史记录,其中应包含每日高点和低点

有多种视图类型,

  • 按天显示 - 显示每小时数据(如果有),否则显示高和低
  • 每周明智 - 显示 7 天的高点和低点
  • 按月显示 - 显示 30 天的最高价和最低价
  • 按年显示 - 显示 12 个月的高点和低点(每个月的高点和低点, 所以 12 个条目)

桌子设计是

HourlyStockPrice

symbol
datetime
price

DayStockPrice

symbol
date
high
low

MonthStockPrice

symbol
date
high
low

由于数据库将有数百万条记录,我决定将信息存储在单独的表中,这样检索会更快。这样好吗?或者我只需要使用单个表并根据需要,必须查询和处理数据。下面是单表架构,

StockPrice

symbol
datetime
high
low

请指教。

【问题讨论】:

  • “我决定将信息存储在单独的表中” 为什么?你不知道分区吗?对于存档,您当然可以有单独的表,但不能用于生产。您存储了多少个符号?如果您按小时存储,为什么不能从该数据中获取最高价和最低价?
  • 他不知道分区。他还认为“数百万条记录”包含大量信息。他将每一行中的符号存储为字符串。
  • 看起来更像是数据仓库设计,然后是数据库设计。 DW 经常被非规范化和扁平化。
  • 这是一个数据仓库。历史股票数据没有任何可操作性。保留三个表以获得最大的选择性能。祝你好运,弄清楚如何在每日和每月股价表中添加行。您还应该有一个包含股票代码、公司名称和其他公司信息的表格。公司的股票代码可能会随着时间而变化。
  • 会有一个插入当前股票价格的网络服务。工作线程将检索数据并更新所有这些表(每天、每月)。我想要最大的选择性能。

标签: sql-server database-design


【解决方案1】:

您还没有提到这些表是如何填充的。我的解决方案是在主要股票价格表上设置一个触发器,该触发器使用插入的日期时间填充单个历史表,并使用前后价格进行更新。

您应该能够使用历史记录表上的索引视图将更新的(日期时间)字段分解为小时、天、月来完成所有其他操作。

如果您不熟悉索引视图,它们只是您可以索引的视图。索引数据与视图而不是表一起保存。

小时示例可能类似于...

CREATE VIEW ivHourlyStockPrice
WITH SCHEMABINDING
AS
BEGIN
     SELECT symbol, convert(varchar(255),updated,106) as Day, select convert(char(2), updated,108) as Hour, AfterPrice as CurrentPrice
     FROM StockHistory
END

CREATE UNIQUE CLUSTERED INDEX idx_ivHourlyStockPrice ON ivHourlyStockPrice(symbol,Day,Hour,CurrentPrice)

然后做类似...

select Day, Hour, CurrentPrice
from ivHourlyStockPrice
where Day='03 Jun 2014'
  and symbol='xxx'

会非常快。

【讨论】:

  • 根据 MSDN “索引视图在底层数据不经常更新时效果最佳。索引视图的维护可能大于维护表索引的成本。如果基础数据经常更新,维护索引视图数据的成本可能超过使用索引视图的性能优势。如果基础数据定期批量更新但主要在更新之间被视为只读,请考虑在更新之前删除任何索引视图,然后重新构建它们. 这样做可能会提高更新的性能"
  • 不会比您建议的表格贵。它只是索引数据而不是表数据的额外数据,但数据库会创建它而不是你。可能还有其他原因会阻止此解决方案,但绝对值得进行适当的调查。
  • 您可能会考虑但可能不可能的另一件事是每小时或通过工作在夜间填充历史记录表。这将消除等式中的任何额外开销。
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2019-05-28
相关资源
最近更新 更多