我正在编写应用程序来存储和检索每天插入数据的股票市场价格数据。我正在存储每种资产(股票)和世界上大多数市场的数据。这是我目前的桌子设计
国家表:
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)是个好主意吗?或者有没有更好的方法来为上述场景设计数据库?
-艾伦-
我会从表名中删除_data - 这是矫枉过正。如果您合理地确定用户将始终按国家/地区过滤数据 - 即一次只查看 1 个国家/地区,那么我会考虑按国家/地区 ID 对表进行分区 - 这样 SQL Server 将使用分区消除来仅选择相关数据。这样,您可以从 1 张表中轻松维护,但您可以获得性能,就好像它是每个国家/地区的单独表一样。(我假设你有企业版)如果您的负载也基于每个国家/地区工作,那么您甚至可以切换分区,然后删除索引以获得更快的负载。