Несколько столбцов (по одному на тип) против одного столбца TEXT / Clob - PullRequest
2 голосов
/ 10 ноября 2009

Мне нужно хранить в базе данных diff столбцов других таблиц. Я хочу использовать одну таблицу.

Вариант А

Таблица с 4 столбцами:

  • id
  • content_type (VARCHAR 255 будет: datetime, integer, varchar, text / clob ...)
  • old_content (CLOB / TEXT, данные, сериализованные программным обеспечением для типа контента)
  • new_content (CLOB / TEXT, данные, сериализованные программным обеспечением для типа контента)

Вариант B

Таблица с ~ 10 + столбцами:

  • id
  • content_type (VARCHAR 255)
  • old_datetime (DATETIME)
  • new_datetime (DATETIME)
  • old_integer (INTEGER)
  • new_integer (INTEGER)
  • old_string (VARCHAR 255)
  • new_string (VARCHAR 255)
  • old_text (CLOB / TEXT)
  • new_text (CLOB / TEXT)
  • ...

Одновременно будет установлен только один кортеж, остальные будут NULL.

Оценка

На данный момент я бы предпочел вариант B - потому что я не большой поклонник сериализованных данных в СУБД. Однако я не знаю, будут ли базы данных (в моем случае MySQL, может быть, Postgre) лучше обрабатывать (сжимать) вариант A в отличие от варианта B.

Я видел подход B в некоторых других проектах (JBoss jBPM), а также чувствую себя более комфортно с B, но я готов читать лекции.

Вы бы использовали A или B и почему? Каковы компромиссы каждого варианта? Или там может быть C?

Другие вещи, которые могут иметь отношение к делу:

  • В текущем проекте я предполагаю, что в столбцах, отличных от TEXT / CLOB, будет больше данных.
  • Я не хочу искать по столбцам без идентификатора, поэтому дополнительный индекс не требуется.

Ответы [ 2 ]

1 голос
/ 10 ноября 2009

Ну, есть еще одно решение, больше таблиц со структурой супертип / подтип. Хорошо, что в этом нет лишних нулей, например:

TABLE DataChange (ID (PK), content_type, ChangeTime)
TABLE IntChange (ID (PK=FK), old_value int, new_value int)
TABLE StrChange (ID (PK=FK), old_value varchar(255), new_value varchar(255))
TABLE TxtChange (ID (PK=FK), old_value text, new_value text)
...

IntChange, StrChange и TxtChange являются типами DataChange, поэтому ID служит первичным и внешним ключом и совпадает с номером ID в таблице DataChange , content_type является столбцом классификатора. Вот модель аналогичного (супертип / подтип) примера.

0 голосов
/ 10 ноября 2009

Это не полный ответ на ваш вопрос, но посмотрите на " Наборы столбцов " в SQL 2008. Вы можете использовать его для ОПЦИИ А ... и сделать его похожим на ВАРИАНТ Б.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...