Каковы правильные сценарии использования для типа данных PostgreSQL Array? - PullRequest
23 голосов
/ 27 июля 2011

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

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

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

Ответы [ 4 ]

20 голосов
/ 27 июля 2011

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

id team1 team2 goals1 goals2

, но вы будете делать

id team[2] goals[2]

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

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

4 голосов
/ 07 июня 2017

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

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

-- Select all posts with tag 'kitty'
SELECT * FROM posts WHERE tags @> '{kitty}';
2 голосов
/ 27 июля 2011

Документация 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] );
0 голосов
/ 24 мая 2019

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

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

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

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