2016-08-25 2 views
0

Я начинающий программист, который в настоящее время работает над тем, как хранить столбцы PostgreSQL в столбце таблицы. В частности, я хотел бы создать таблицу с столбцом с именем «тип», который хранит один из следующих типов: boolean, integer, text и enum. Концептуально, однако, я хотел бы, чтобы пользователь сохранил, какие значения (ы) он хотел бы использовать. Целое число, фрагмент текста или список вариантов должны быть возможны. См. Таблицу примеров ниже.Как хранить разные типы в столбце?

id | type        | default value 
--------------------------------------------------------------- 
1  | integer       |  5 
2  | boolean       |   
3  | enum("red", "blue", "yellow") |  red 

Последний случай смущает меня. С моими ограниченными знаниями я знаю, что создание таблицы с столбцом с именем type с типом enum("boolean", "integer", "text", "enum") возможно, но я не вижу, как это разрешает последний случай в таблице примеров. Кажется, что это разрешает только тип enum, но в этом случае я не могу указать значение по умолчанию, такое как red, потому что красный цвет не указан в параметрах типа enum.

я остался с двумя вопросами:

  1. При создании таблицы, какой тип я даю столбец с именем type?
  2. Как сохранить третью запись в таблице примеров, чтобы я мог сохранить значение по умолчанию, и я могу проверить, действительно ли значение по умолчанию подходит для выбранного типа?

Любой ответ или помощь с благодарностью. Благодаря!

+1

Нет. Это очень очень очень плохой дизайн. Не делай этого. Повернись и попробуй что-нибудь еще. Не выполняйте это. Ааааа! STAHP! – JNevill

+0

Ха-ха, взгляните на мой второй комментарий к ответу Камиля. Это должно прояснить мой подход. – tedvangageldonk

ответ

1

Я думаю, вы смешиваете/смешиваете много разных вещей.

Что касается типа перечислений

Вы можете объявить столбец таблицы, чтобы быть enumerated type. Для этого необходимо определить тип:

CREATE TYPE my_color_enum AS ENUM ('red', 'blue', 'yellow'); 

Затем используйте его в таблице так же, как любой другой тип:

CREATE TABLE test (column1 my_color_enum); 

Если вам нужно присвоить значение по умолчанию column1 это только позволяет определить значение по умолчанию, которое существует в вашем ENUM типа, так, например, в то время как это действует:

CREATE TABLE test (column1 my_color_enum default 'red'); 

T его не и даст ошибку:

CREATE TABLE test (column1 my_color_enum default 'green'); 

Поскольку "green" значение не присутствует в вашем типе.Сообщение об ошибке будет выглядеть следующим образом (это вольный перевод, а не точное сообщение об ошибке):

Invalid input value for enum my_color_enum: "green"

хранения различных типов данных в одном столбце

Это похоже на плохой дизайн, но если вы на самом деле это нужно, и предпочел бы избежать text типа данных, а затем бросая вперед и назад, вы могли бы использовать json, jsonb и так далее ...

Он придет, чтобы укусить вас, если вы решили иметь таблицу поиска, которая ул руд.

+0

Привет, Камиль! Спасибо за ответ. Ваше объяснение абсолютно ясное для меня. Недостатком является то, что я действительно хочу хранить разные имена типов в одном столбце. Учитывая ваш ответ: если бы я должен был выбрать столбец с именем 'type' и напечатать' text' и вставить значения в столбец, такие как '' text "', '" boolean "и' "enum ('red' , 'blue', 'yellow') ", было бы еще возможно проверить, является ли данное значение по умолчанию, например" red ", значением, присутствующим в строке" enum ('red', 'blue', ' желтый ")"? – tedvangageldonk

+0

Я чувствую, что вы смешиваете типы столбцов со значениями столбцов. Почему вы должны хранить значения, которые являются именами типов данных внутри столбца? –

+0

Потому что я пишу часть программного обеспечения, которое позволяет пользователю динамически добавлять столбец в таблицу. Текущее программное обеспечение имеет предопределенные столбцы таблицы. Я прошу пользователя указать имя для нового столбца таблицы и тип значений, которые должен содержать новый столбец. Например, продукт может иметь цвет (новое имя столбца таблицы), которое является красным, синим или желтым. Я отслеживаю динамически добавленные столбцы по таблице, которую я сейчас разрабатываю. Запись в этой таблице (в этом примере) является тогда (имя, тип, значение по умолчанию). VALUES («цвет», «перечисление (красный, синий, желтый)», «). – tedvangageldonk

Смежные вопросы