0

这与问题有关:如何在 Oracle 11g 中存储无限字符?

如果我需要的最大值是 8000 个字符,我可以再添加 3 个 varchar2 列,这样我就有 4 个列,每列 2000 个字符,得到 8000 个字符。因此,当第一列已满时,值将溢出到下一列,依此类推。这种设计会有什么不好的副作用吗?请建议。

4

3 回答 3

11

为什么不直接使用CLOB列呢?我阅读了您的其他链接,但我不明白为什么您的 DBA 不喜欢这些类型的列。我的意思CLOB是,Oracle 的一个重要特性就是为了这个目的。并且贵公司在购买 Oracle 时为该功能付出了高昂的代价,那么为什么不充分利用 Oracle 的功能,而不是尝试想出一些技巧来做一些数据库并不是真正设计用来做的事情呢?

也许与其花时间尝试设计技巧来克服 DBA 造成的限制,不如花一些时间教育 DBA 为什么CLOBs 是解决问题的正确功能。

当数据库具有我需要做出一个好的设计的功能时,我永远不会对一个糟糕的设计感到满意。如果 DBA 是问题,那么他们需要改变他们的观点,或者我认为你应该去高级管理层。

于 2010-06-07T21:21:49.113 回答
3

我同意dcp你应该使用 CLOB。但是,如果您被迫仅使用 VARCHAR2 列“滚动您自己的”无限文本,那么我不会通过向表中添加越来越多的 VARCHAR2 列来做到这一点,如下所示:

create table mytable
  ( id integer primary key
  , text varchar2(2000)
  , more_text varchar2(2000)
  , and_still_more_text varchar2(2000)
  );

相反,我会将文本移动到一个单独的子表中,如下所示:

create table mytable
  ( id integer primary key
  );
create table mytable_text
  ( id references mytable(id)
  , seqno integer
  , text varchar2(2000)
  , primary key (id, seqno)
  );

然后,您可以使用 mytable_text 中的许多行为每个 mytable 行插入任意数量的文本。

于 2010-06-08T09:26:16.880 回答
2

要添加到 DCP 和 Tony 的出色答案:

您询问您提出的方法是否会产生不良的副作用。这里有几点需要考虑:

  1. 假设您要搜索特定字符串的文本数据。您的方法需要在包含您的文本的每一列上重复搜索 - 导致一个复杂且低效的 WHERE 子句。
  2. 每次您想扩展文本字段时,您都必须添加另一列,这意味着您现在必须修改您编码的每个地方 (1)。
  3. 在你之后必须维护这种结构的每个人都会诅咒你的名字;-)
于 2010-06-08T16:39:56.210 回答