2010-05-22 87 views
1

我有一種情況,我需要將二進制數據作爲blob列存儲在Oracle數據庫中。我的數據庫中有三個不同的表格,我需要爲每條記錄存儲一個blob數據。並非每個記錄都必須始終具有blob數據。它依賴於時間和用戶。blob數據庫設計 - 保存在單獨的表中?

  • 表一將爲幾乎每個記錄存儲* .doc文件。
  • 表二將隨意存儲* .xml。
  • 表三將存儲的圖像(頻率未知)

這是保持一個單獨的表來存儲它指向相應的表PK的各種BLOB數據的好方法? (是的,沒有FK,我假設程序會維護它)。它會像下面的一些事情,

BLOB|PK_ID|TABLE_NAME 

或者,它是一個好主意,讓BLOB列在不同的表?

至於我的應用程序運行時而言,

表2會很頻繁讀取。雖然blob列將不被要求。
表2的記錄將被頻繁刪除。

各個表中的其他blob數據將不會經常訪問。所有的blob內容將根據需要進行閱讀。

我在想第一種方法會對我更好。在性能或可維護性方面對此設計有何顧慮?

回答

3

如果在給定記錄和LOB之間存在一對一的關係,那麼最好的辦法是在記錄中聲明LOB列。 Oracle允許我們爲LOB聲明一個單獨的表空間,所以對存儲沒有太大的影響。

create table t23 
    (id number not null 
    , col1 number not null 
    , col2 date not null 
    , col3 varchar2(255) 
    , a_doc clob 
    , x_doc xmltype 
    , constraint t23_pk primary key (id) 
) 
tablespace app_date 
lob (a_doc) store as basicfile a_lob (tablespace lob_data) 
lob (x_doc) store as securefile x_lob (tablesapce xml_data) 
/

(SECUREFILE是11g。Find out more中引入的企業版功能)。

這種方法的主要問題是,如果您不想包含LOB列,您將不得不顯式指定要選擇的列。這應該不是一個困難,因爲它是最佳實踐:select * from ....是一個等待發生的錯誤。

「的三表將不得不存儲 圖像」

如果你有一個一對多的關係,那麼你就需要有一個單獨的表圖像。

當涉及到存儲LOB和調整受影響的查詢時,存在許多細微之處。我建議你閱讀this Oracle white paper, from the OTN website

+0

在不知不覺中,我試圖做同樣的事情,在1-1關係中添加新列,併爲1-N添加新表。我不確定LOB。我將在這裏與oracle專家討論並回來...... 感謝您的建議。 – user331311 2010-05-24 04:23:28