带有 blob 的数据库设计 - 保存在单独的表中?

use*_*311 3 oracle database-design blob

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

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

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

BLOB|PK_ID|TABLE_NAME
Run Code Online (Sandbox Code Playgroud)

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

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

表 2 将被经常阅读。虽然不需要 blob 列。
表2的记录会经常被删除。

相应表中的其他 blob 数据不会被频繁访问。将根据需要读取所有 blob 内容。

我认为第一种方法对我更有效。在性能或可维护性方面对这种设计有任何担忧吗?

APC*_*APC 5

如果给定记录和 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)
/ 
Run Code Online (Sandbox Code Playgroud)

(SECUREFILE 是 11g 中引入的企业版功能。 了解更多信息)。

这种方法的主要特点是,如果您不想包含 LOB 列,则必须明确指定要选择的列。这不应该是一个困难,因为它是最佳实践:select * from ....是一个等待发生的错误。

“表三将不得不存储图像”

如果您有一对多的关系,那么您将需要有一个单独的图像表。

在存储 LOB 和调整受影响的查询时,有很多微妙之处。我建议您阅读OTN 网站上的这份 Oracle 白皮书