Подтвердить что ты не робот

Каковы правильные варианты использования для типа данных PostgreSQL Array?

Мне кажется, что функциональность типа данных массива PostgreSQL многократно перекрывается со стандартными отношениями "один ко многим" и "многие ко многим".

Например, таблица с именем users может иметь поле массива с именем "favorite_colors" , или может быть отдельная таблица с именем "favorite_colors" и таблица соединений между "пользователями" и "favorite_colors" .

В каких случаях тип данных массива ОК для использования вместо полномасштабного соединения?

4b9b3361

Ответ 1

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

id team1 team2 goals1 goals2

но будет делать

id team[2] goals[2]

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

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

Ответ 2

Один невероятно удобный пример использования:

CREATE TABLE posts (
    title TEXT,
    tags TEXT[]
);

-- Select all posts with tag 'kitty'
SELECT * FROM posts WHERE tags @> '{kitty}';

Ответ 3

Документация Postgresql дает хорошие примеры:

  CREATE TABLE sal_emp (
     name            text,
     pay_by_quarter  integer[],
     schedule        text[][]
 );

Вышеприведенная команда создаст таблицу с именем sal_emp со столбцом введите текст (имя), одномерный массив типа integer (pay_by_quarter), который представляет зарплату работника по кварталу, и двумерный массив текста (графика), который представляет собой еженедельный график работы сотрудников.

Или, если вы предпочитаете:

 CREATE TABLE tictactoe (
     squares   integer[3][3] );

Ответ 4

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

CREATE TABLE Question (
  id integer PRIMARY KEY,
  question TEXT,
  options VARCHAR(255)[],
  answer VARCHAR(255)
)  

Это намного лучше, чем создание таблицы question_options и получение опций с помощью объединения.