2010-05-22 91 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