Запрос массива текста в postgres - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть тип массива, который я хочу сохранить в Postgres.Один из основных вариантов использования, который у меня есть, - это посмотреть, есть ли в какой-либо из записей массив, в котором есть строка.

например.

| A | ["NY", "Paris", "Milan"] |
| B | ["Paris", "NY"]          |
| C | []                       |
| D | ["Milan"]                |

Существует ли строка с Paris в массиве?Какие строки имеют Milan в массиве?и т. д.

У меня есть 2 варианта, как хранить столбец.Я могу либо сделать его типом text[], либо преобразовать его в json как {"cities": ["NY", "Paris", "Milan"]}, а затем сохранить как JSONB поле

Однако я не уверен, что бы разрешить самые быстрые запросы для использованиядело у меня есть.Есть ли какой-нибудь явно лучший способ сделать это?Связываю ли я себя каким-либо образом, выбирая одно из другого?Если я выберу одно из другого, то как я могу запросить БД?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Поскольку вы, похоже, храните простые списки значений, я бы рекомендовал использовать тип данных Array вместо JSON, который лучше подходит для более сложных случаев (вложенные структуры данных, ассоциативные массивы, ...).

Чтобы проверить значение элемента в любой позиции массива, вы можете использовать функцию массива ANY().

Вот запрос, который вернет все записи, где массив, хранящийся в столбце cities, содержит 'Paris':

SELECT t.* FROM mytable t WHERE 'Paris' = ANY(t.cities);

Выход:

id  cities
---------------------------
A   ["NY","Paris","Milan"]
B   ["Paris","NY"]

Демонстрация на DB Fiddle

Для получения дополнительной информации:

0 голосов
/ 02 февраля 2019

Я заметил, что лучше запросить JSONB, если это простое хранилище значений ключей.Например, вы хотите хранить в строке произвольную информацию, чтобы вы не знали, какими будут столбцы (ключи).info = {"a": "apple", "b": "ball"}

Для таких случаев использования, как ваш, было бы лучше, если бы вы могли создать базу данных с простыми таблицами, чтобы вы могли использовать JOINS иИндексы в ваших интересах.

Вы можете реструктурировать таблицы следующим образом:

Местоположение

id | name
----------
1  | Paris
2  | NY
3  | Milan 

Другая таблица (с внешним ключом в таблице местоположений)

user | location_id
--------------------
A    | 1
A    | 3
B    | 2

Используя этот набор таблиц, было бы легко опрашивать всех пользователей с местоположением Париж с помощью JOINS.

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