2010-01-07 63 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