使用blob进行数据库设计 - 保留在单独的表中?

时间:2010-05-22 09:24:21

标签: oracle database-design blob

我有一种情况需要将二进制数据作为blob列存储在Oracle数据库中。我的数据库中有三个不同的表,我需要为每个记录存储blob数据。并非每条记录都必须始终具有blob数据。这取决于时间和用户。

  • 表一将存储几乎每条记录的* .doc文件。
  • 表2将选择性地存储* .xml。
  • 表三将存储图像(频率未知)

这是一种维护单独表来存储指向相应表PK的各种blob数据的好方法吗? (是的,没有FK,我假设程序会维护它)。这将是下面的一些事情,

BLOB|PK_ID|TABLE_NAME

或者,将blob列保存在单独的表中是个好主意吗?

就我的应用程序运行时而言,

表2将非常频繁地阅读。虽然不需要blob列 表2的记录将被频繁删除。

不会频繁访问各个表中的其他blob数据。所有blob内容都将根据需要进行阅读。

我认为第一种方法对我来说会更好。在性能或可维护性方面对此设计有任何疑虑吗?

1 个答案:

答案 0 :(得分:4)

如果给定记录和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