既然你打算使用关系数据库管理系统,我会将这些数据存储在一组规格化的表格中。第一刺来了(这是所有基于SQL Server 2005上,又难过,):
CREATE TABLE MyData
(
LineOfBusiness varchar(50) not null
,Year smallint not null
,Element varchar(50) not null
,Value float not null
,constraint PK_MyData
primary key (LineOfBusiness, Year, Element)
)
有两个VARCHAR(50)在你的主键可被视为效率低下,特别是 如果你最终有很多数据。 (a)直到你达到64k时,我才会出汗,但在你点击MB数据时,(b) ,现在要回去修改你的 架构还为时过晚 - 所以不妨一试这是第一次。
这可能是高效的LineOfBusiness移动到一个查找表:
CREATE TABLE LineOfBusiness
(
LineOfBusinessId int not null
constraint PK_LineOfBusiness
primary key
,Description varchar(50) not null
)
如果“元素”可以将业务线之间的重复,它肯定是更有效 将其移动到一个查找表:
CREATE TABLE Element
(
ElementId int not null
constraint PK_Element
primary key
,Description varchar(50) not null
)
年是一个简单的数值,1900年和2100(如果不是,那么是吧?),所以 没有必要正常化出来之间下降。年份查询表是否有用取决于应用程序要求。 (也许有FirstYear和LastYear列LineOfBusiness有道理?)
基于以上两个表,并在关系完整性的工作,你会最终
CREATE TABLE MyData
(
LineOfBusinessId int not null
constraint FK_MyData__LineOfBusiness
foreign key references LineOfBusiness (LineOfBusinessId)
,Year smallint not null
,ElementId int not null
constraint FK_MyData__Element
foreign key references Element (ElementId)
,Value float not null
,constraint PK_MyData
primary key (LineOfBusinessId, Year, ElementId)
)
这使得许多问题开关于如何加载数据并确保/保留 的有效性,当然查询(可能是数据透视查询)将需要被编写为 ,但是如果您的初始存储设计 不足以满足您的要求,那么您可以旋转并取而代之。
或使用数据透视表。他们在SQL服务器中并不难。 – 2010-01-07 20:32:32