2016-07-12 8 views
0

私は、データが日常的に挿入される株式市場の価格データを格納し、取得するアプリケーションを書いています。私は各資産(株式)と世界の市場のほとんどのデータを保管しています。これは、テーブル大規模な株価データのデータのためのSQL Serverデータベース設計

テーブルの私の現在の設計である:

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 

版IE、大量の行で満たされるでしょう、私は現時点で持っている懸念がStock_Price_Dataテーブルです国の特定の市場では、容易に2万の資産が存在する可能性があります。したがって、1年間(260日の取引)に、私は潜在的に各国に520万行を持つことができます。

アプリケーションは、ユーザーがデフォルトの国以外のデータにアクセスすることを制限しません(ログイン時に設定されます)。

各国ごとに別々のテーブル(Stock_Price_Data_AU)を設定することをおすすめしますか?または、上記のシナリオでデータベースを設計するより良い方法はありますか?すべての

-Alan-

+0

これは膨大な量のデータではありません。問題がある場合は、デザインを見直してください。 – DB101

+0

毎日挿入すると、Stock_Priceに[AssetId]、[PriceDate]のPKだけがあると考えられます。 [StockPriceDataId]の実際の目的はありますか? – Paparazzi

+0

単一のテーブルにデータを保持すると、メンテナンスが向上します。テーブルのインデックスのみを作成すると、データの取得が高速になります。 –

答えて

0

まず - その行き過ぎ - 私はテーブル名から_dataをドロップすると思います。 ユーザーが常に国別にデータをフィルタリングすることが合理的である場合(つまり、一度に1カ国のみを見ている場合)、国IDで表をパーティション化することを検討します。この方法でSQL Serverはパーティションの削除を使用して、関連するデータ。このようにして、1つのテーブルからメンテナンスが容易になりますが、それは国ごとに別々のテーブルであるかのようにパフォーマンスが得られます。 (私はあなたがEnterprise Editionを持っていると仮定しています)負荷が国ごとに作用する場合でも、パーティションを切り替えて索引を削除して、より高速な負荷を得ることさえできます。

関連する問題