Как изменить данные таблицы Postgres в зависимости от ее содержимого? - PullRequest
0 голосов
/ 17 июня 2010

Возможно, это очень простой вопрос, но я изо всех сил пытаюсь найти правильные ключевые слова, чтобы найти его в Google.

У меня есть таблица Postgres, среди содержимого которой есть столбец типа text с именем content_type. Это хранит, какой тип записи хранится в этой строке.

Существует всего около 5 различных типов, и я решил, что хочу изменить один из них, чтобы он отображался в моем приложении как что-то другое (я их непосредственно отображал).

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

Во-первых, быстрый порог вопроса, это хорошая идея? Любой отзыв или что-то я пропустил?

Во-вторых, и мой главный вопрос: какую команду Postgres я мог бы ввести, чтобы сделать подобное изменение? Я думаю, я мог бы начать с переименования старого столбца content_type в old_content_type, а затем создать новый целочисленный столбец content_type. Однако какая команда будет смотреть на строку old_content_type строки и заполнять новый столбец content_type, основываясь на этом?

Ответы [ 2 ]

1 голос
/ 17 июня 2010

В идеале вы должны иметь эти поля, ссылающиеся на таблицу, содержащую определения типа. Это должно быть через ограничение внешнего ключа. Таким образом, вы узнаете, что ваша база данных чистая и не имеет недопустимых значений (т. Е. Ссылочная целостность).

Есть много способов справиться с этим:

  1. Наличие таблицы для каждого поля, которое может содержать несколько значений (например, перечисление), является наиболее очевидным, но оно ломается, когда у вас есть таблица, которая требует много атрибутов.

  2. Вы можете использовать Модель значения атрибута сущности , но имейте в виду, что ею слишком легко злоупотреблять и вызывать проблемы при росте.

  3. Вы можете использовать или обратиться к моему решению по реализации PET (Таблицы перечисления параметров) . Это дом на полпути между 1 и 2.

1 голос
/ 17 июня 2010

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

Вам просто нужно запустить обновление, чтобы заполнить новый столбец:

update table_name set content_type = (case when old_content_type = 'a' then 1 
  when old_content_type = 'b' then 2 else 3 end);

Если вы работаете в Postgres 8.4, то лучше использовать тип перечисления вместо простого целого числа.

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