用于大容量股票市场价格数据的 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 数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

大容量 SQL Server 2008 的关键数据类型?

sql server 2008数据库怎么配置

使用 SQL Server “检查空间中的容量可用性”

SQL Server数据库的三种恢复模式:简单恢复模式完整恢复模式和大容量日志恢复模式

更新烧瓶中的 SQL 查询不适用于浮点/小数点

sqlserver的数据库的最大容量?