2010-01-07 95 views
0

我正在寻找的数据库如何设置保存数字数据建模应用一点建议。我的用户有一个电子表格,用于保存建模应用程序中使用的数据。数据的结构如下:每个选项卡是一行业务,列是年,行是元素。所述细胞是标准的十进制数XX.XX等的数据库模型半结构化数据

 2005 2006 2007 2008 2009 2010 2011 2012 
data1 2.5 3.5 
data2  
data3 

第二应用可以根据从Excel或ODBC查询任一个OLE链路接收数据。我想将数据放入一个数据库(SQL Server或Oracle),但我对如何构建平衡数据如何进入数据库,用户交互,然后输出查询到第二个应用程序的表不能确定。业务线,元素和年份都不固定。

我知道它基本上是一个数据透视表,所以我正在看的答案是一个表 {line,element,year,value}。考虑到与获取数据出入这种格式我将与{线,元素,year1..yearx}的表更好的列对未来几年一些任意数量的相关问题?这不是实体属性值的经典案例,但有点类似。元素不会经常变化,但其中有大量元素超过300。我可以将它们分组到不同的表中,并使用像{line,year,element1..elementX}这样的结构。这可能是最简单的开发,但看起来并不“正确”。

输出查询将典型地保持在与线,年单个数据元素,并传递给通过ODBC第二应用的值。

回答

0

既然你打算使用关系数据库管理系统,我会将这些数据存储在一组规格化的表格中。第一刺来了(这是所有基于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) 
) 

这使得许多问题开关于如何加载数据并确保/保留 的有效性,当然查询(可能是数据透视查询)将需要被编写为 ,但是如果您的初始存储设计 不足以满足您的要求,那么您可以旋转并取而代之。

2

这不是EAV,它是一种不同的反模式,我称之为元数据Tribbles。也就是说,他们看起来很友善和方便,但他们往往会失去控制。

定义一个第二表与年为一列,所述数字数据的值作为一个附加列。

不要试图写入所有元素值的查询对同一结果行定线。相反,使用返回多行的查询,并编写一些应用程序代码来遍历它们以收集所需的所有值。

+1

或使用数据透视表。他们在SQL服务器中并不难。 – 2010-01-07 20:32:32

1

也许是这样的:

lineofbusiness = (id, name) 
elements = (lineofbusinessid, year, value) 

所以元素表可能是这样的:

 
    lineofbusinessid year value 
     1    2009 2.3 
     1    2010 4.0 
     1    2011 1.0 
     2    2009 9.0