Как создать SET-подобный тип на postgresql - PullRequest
12 голосов
/ 03 марта 2011

Я хотел бы создать столбец дней недели, чтобы мы могли выбрать более одного дня.

Я знаю, что тип enum может это сделать, но он может содержать только один элемент.

Как я могу создать тип данных в PostgreSQL, чтобы у меня было что-то, что функционирует, как перечисление с множественным выбором, точно так же, как набор в MySQL?

Ответы [ 4 ]

8 голосов
/ 08 июля 2016

Используйте тип столбца HSTORE. HSTORE хранит пары ключ / значение. Вы можете использовать нулевые значения, если вам нужно только проверить, существует ли ключ.

См. https://www.postgresql.org/docs/current/static/hstore.html.

Например, спросить Есть ли в моем магазине 'x'? , do

CREATE EXTENSION HSTORE;  --create extension only has to be done once
SELECT * FROM 'x=>null,y=>null,z=>null'::HSTORE ? 'x';

Я считаю, что это операция O (1) . Напротив, проверка на содержание в столбце типа ARRAY имеет вид O (n) .

5 голосов
/ 03 марта 2011

Полагаю, массив является наиболее близким к типу данных страшного набора.

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

4 голосов
/ 26 марта 2013

Битовые строки BIT(n) являются наиболее близкими PostgreSQL к типам SET MySQL.

Для дней недели используйте BIT(7).

В отличие от SET MySQL, ширина типа BIT не ограничена до 64 бит или менее.

0 голосов
/ 03 марта 2011

Определить тип данных, в котором выбранные значения хранятся в виде строки, разделенной запятыми.Учитывая структуру, которую вы используете для доступа к базе данных, относительно легко написать TypeDef, который преобразует эту строку в набор и из набора (см., Например, UserType в Hibernate).

Вы должны будете дополнительно указать, какие операции вы выполняетенужно в базе данных.Как будет работать сортировка?Есть ли оператор добавления (+)?Все это может быть прекрасно реализовано в Postgres, но вам придется прочитать всю документацию для себя.

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