用于大容量股票市场价格数据的 SQL Server 数据库设计
Posted
技术标签:
【中文标题】用于大容量股票市场价格数据的 SQL Server 数据库设计【英文标题】:SQL Server database design for high volume stock market price data 【发布时间】:2016-07-12 14:14:55 【问题描述】:我正在编写应用程序来存储和检索每天插入的股票市场价格数据。我正在存储每种资产(股票)和世界上大部分市场的数据。这是我目前的表格设计
国家表:
CREATE TABLE [dbo].[List_Country]
(
[CountryId] [char](2) NOT NULL,
[Name] [nvarchar](100) NOT NULL,
[CurrenyCode] [nvarchar](5) NULL,
[CurrencyName] [nvarchar](50) NULL
CONSTRAINT [PK_dbo.List_Country]
PRIMARY KEY CLUSTERED ([CountryId] ASC)
)
资产表:
CREATE TABLE [dbo].[List_Asset]
(
[AssetId] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[CountryId] [char](2) NOT NULL,
CONSTRAINT [PK_dbo.List_Asset]
PRIMARY KEY CLUSTERED ([AssetId] ASC)
)
国家的外键约束:
ALTER TABLE [dbo].[List_Asset] WITH CHECK
ADD CONSTRAINT [FK_dbo.List_Asset_dbo.List_Country_CountryId]
FOREIGN KEY([CountryId])
REFERENCES [dbo].[List_Country] ([CountryId])
ON DELETE CASCADE
GO
Stock_Price 表:
CREATE TABLE [dbo].[Stock_Price_Data]
(
[StockPriceDataId] [int] IDENTITY(1,1) NOT NULL,
[AssetId] [int] NOT NULL,
[PriceDate] [datetime] NOT NULL,
[Open] [int] NOT NULL,
[High] [int] NOT NULL,
[Low] [int] NOT NULL,
[Close] [int] NOT NULL,
[Volume] [int] NOT NULL,
CONSTRAINT [PK_dbo.Stock_Price_Data]
PRIMARY KEY CLUSTERED ([StockPriceDataId] ASC)
)
资产的外键约束:
ALTER TABLE [dbo].[Stock_Price_Data] WITH CHECK
ADD CONSTRAINT [FK_dbo.Stock_Price_Data_dbo.List_Asset_AssetId]
FOREIGN KEY([AssetId])
REFERENCES [dbo].[List_Asset] ([AssetId])
ON DELETE CASCADE
我现在担心的是 Stock_Price_Data 表会充满大量行,即对于一个国家的特定市场,很容易有 20,000 个资产。因此,在一年(260 天的交易)中,我可能有每个国家/地区的 520 万行。
应用程序不限制用户访问默认国家/地区以外的数据(在登录期间设置)。
为每个国家/地区设置单独的表(即 Stock_Price_Data_AU)是个好主意吗?或者有没有更好的方法来为上述场景设计数据库?
-艾伦-
【问题讨论】:
这不是一个庞大的数据量。如果您有问题,请重新审视您的设计。 如果每天插入,我会认为 Stock_Price 只有 [AssetId]、[PriceDate] 的 PK。 [StockPriceDataId] 有什么真正的用途。 如果是单表维护,那么维护比较好,只在表上创建索引,这样数据检索会更快。 【参考方案1】:首先 - 我会从表名中删除 _data - 它的过度杀伤力。 如果您有理由确定用户将始终按国家/地区过滤数据 - 即一次只查看 1 个国家/地区,那么我会考虑按国家/地区 ID 对表进行分区 - 这样 SQL Server 将使用分区消除来仅选择相关的数据。通过这种方式,您可以从 1 个表中轻松维护,但您可以像每个国家/地区的单独表一样获得性能。 (我假设您有企业版)如果您的负载也适用于每个国家/地区,那么您甚至可以切换分区然后删除索引以获得更快的负载。
【讨论】:
以上是关于用于大容量股票市场价格数据的 SQL Server 数据库设计的主要内容,如果未能解决你的问题,请参考以下文章