В Oracle 11g символы разбросаны по нескольким столбцам?


person user32262    schedule 07.06.2010    source источник
comment
Это много текста - какой вариант использования требует такого количества?   -  person OMG Ponies    schedule 08.06.2010


Ответы (3)


Почему бы вместо этого просто не использовать столбец CLOB? Я прочитал вашу другую ссылку, и я не понимаю, почему ваш администратор баз данных не любит эти типы столбцов. Я имею в виду, что CLOB - важная функция Oracle именно для этой цели. И ваша компания заплатила хорошие деньги за эту функцию при покупке Oracle, так почему бы не использовать Oracle в полной мере вместо того, чтобы пытаться придумать хаки, чтобы сделать что-то, для чего БД на самом деле не предназначена?

Может быть, вместо того, чтобы тратить время на попытки разработать хаки для преодоления ограничений, созданных вашими администраторами баз данных, вам следует потратить некоторое время на то, чтобы разъяснить администраторам баз данных, почему CLOBs - это правильная функция для решения вашей проблемы.

Меня никогда не устроит плохой дизайн, если в базе данных есть функция, необходимая для создания хорошего дизайна. Если проблема заключается в администраторах баз данных, им следует изменить свою точку зрения или, по моему мнению, вам следует обратиться к высшему руководству.

person dcp    schedule 07.06.2010
comment
+1 отличный ответ. В частности, мне нравится последнее предложение пункта 1. - person DCookie; 08.06.2010
comment
@DCookie - Спасибо за комплимент :). - person dcp; 08.06.2010

Я согласен с 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, используя много строк в mytable_text.

person Tony Andrews    schedule 08.06.2010

Чтобы добавить к отличным ответам DCP и Тони:

Вы спрашиваете, будет ли предложенный вами подход иметь какие-либо серьезные побочные эффекты. Вот несколько вещей, которые следует учитывать:

  1. Предположим, вы хотите выполнить поиск в текстовых данных определенной строки. Ваш подход требует повторения поиска в каждом столбце, содержащем ваш текст, что приводит к запутанному и неэффективному предложению WHERE.
  2. Каждый раз, когда вы хотите расширить текстовое поле, вам нужно добавить еще один столбец, что теперь означает, что вам нужно изменить каждое место, которое вы закодировали для выполнения (1).
  3. Все, кому придется поддерживать эту структуру после того, как вы проклянете свое имя ;-)
person DCookie    schedule 08.06.2010
comment
еще хуже - поиск (точка №1) не будет работать, когда поисковый запрос пересекает границу между двумя столбцами ... +1 для точки №3 :) - person Jeffrey Kemp; 09.06.2010