半结构化数据的数据库模型

时间:2010-01-07 20:21:24

标签: sql sql-server

我正在寻找一些关于如何设置数据库来保存建模应用程序的数值数据的建议。我的用户有一个电子表格,其中包含用于建模应用程序的数据。数据的结构如下:每个选项卡都是一个业务线,列是年,行是元素。单元格是标准十进制数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}。鉴于与使用这种格式输入和输出数据相关的问题,我最好使用{line,element,year1..yearx}的表格,以及未来几年的任意数量的列?这不是实体属性值的经典案例,但有些类似。这些元素不会经常变化,但其中有300多个元素。我可以将它们分组到单独的表中并使用像{line,year,element1..elementX}这样的结构。这可能是最简单的开发,但似乎并不“正确”。

输出查询通常会保留到单个数据元素,其中line,year和values通过odbc传递给第二个应用程序。

3 个答案:

答案 0 :(得分:2)

这不是EAV,它是一种不同的反模式,我称之为元数据Tribbles 。也就是说,它们似乎很友好和方便,但它们往往会失控。

定义第二个表,其中年份为一列,数值数据值为一个附加列。

不要尝试为同一结果行上的给定行的所有元素值编写查询。相反,使用返回多行的查询,并编写一些应用程序代码来迭代它们以收集所需的所有值。

答案 1 :(得分: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
  

答案 2 :(得分: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之前我不会出汗,但是(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之间的简单数值(如果不是,那么吧?), 所以没有必要将它标准化。年份查找表是否有用取决于应用程序要求。 (也许LineOfBusiness中的FirstYear和LastYear列有意义吗?)

根据以上两个表并以关系完整性为基础,您最终会得到

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)
 )

这就如何加载数据和确保/保存者留下了许多问题 有效性,当然还需要查询(可能还有枢轴查询) 如果您的初始存储设计是,那么您可以旋转轮子并且无处可去 不足。