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