2013-02-20 53 views
0

我在Oracle數據庫中有一個有60列的表。以下是表格結構。Oracle表結構

ID NAME TIMESTAMP PROERTY1 ...... PROPERTY60 

該表格將有許多行。該表的大小將以GB爲單位。但是,表結構的問題在於,如果必須添加新屬性,我必須更改模式。爲了避免這種情況,我想將表格結構更改爲以下內容。

ID NAME TIMESTAMP PROPERTYNAME PROPERTYVALUE 

將會有一個樣本行。

1 xyz 40560 PROPERTY1 34500 

這樣我就可以解決問題,但表格的大小會變大。它在提取數據方面是否會對性能產生影響?我是Oracle的新手。我需要你的建議。

+0

爲什麼您必須更改架構以將新屬性列添加到您的表中? – Wolf 2013-02-20 06:10:34

+0

可以說,我想在將來支持「PROPERTY61」,在這種情況下,如果我採用第一種方法,我必須更改模式。 – user2032118 2013-02-20 06:13:53

+0

這與EAV [實體,屬性,值](http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)方案很接近。由於各種原因,這通常是一個糟糕的主意。這不會阻止人們使用它,但查詢變得非常困難,甚至更難以確保數據的自我一致。 – 2013-02-20 06:14:28

回答

1

如果我要添加新的屬性,我必須要改變架構

是實際的問題?在較新版本的Oracle中添加列已得​​到cheapermore convenient


但是,如果你仍然需要讓你的系統的動態,從某種意義上說,你不必執行DDL新特性,下面簡單EAV實施可能會是一個良好的開端:

CREATE TABLE FOO (
    FOO_ID INT PRIMARY KEY 
    -- Other fields... 
); 

CREATE TABLE FOO_PROPERTY (
    FOO_ID INT REFERENCES FOO (FOO_ID), 
    NAME VARCHAR(50), 
    VALUE VARCHAR(50) NOT NULL, 
    CONSTRAINT FOO_PROPERTY_PK PRIMARY KEY (FOO_ID, NAME) 
) ORGANIZATION INDEX; 

注意ORGANIZATION INDEX:整個表只是一個大的B-Tree,根本沒有表堆。屬於相同FOO_ID的屬性在物理上緊密地存儲在一起,因此檢索已知FOO_ID的所有屬性將很便宜(但不像所有屬性位於同一行時便宜)。

您也可能要考慮是否是恰當的:

  • 在FOO_PROPERTY添加更多的索引(例如對屬性名稱或值搜索)。只要注意索引組織表中的二級索引的額外成本。
  • 切換FOO_PROPERTY PK中列的順序 - 如果您主要搜索屬性名稱並且很少檢索給定FOO_ID的所有屬性。這也會使得index compression可行,因爲索引的前沿現在是相對較寬的字符串(而不是窄整數)。
  • 對VALUE使用不同的類型(例如RAW,或者甚至是in-line BLOB/CLOB,這可能會影響性能,但也可能會提供額外的靈活性)。或者,您甚至可以爲每種可能的值類型都有一個單獨的表格,而不是將所有內容填入字符串中。
  • 將屬性「聲明」分離到自己的表中。這個表有兩個關鍵字:除了字符串NAME之外,它還會有整數PROPERTY_ID,然後它可以用作FOO_PROPERTY中的FK而不是NAME(以更多JOIN的價格節省一些存儲空間)。