Каковы правильные варианты использования для типа данных PostgreSQL Array?
Мне кажется, что функциональность типа данных массива PostgreSQL многократно перекрывается со стандартными отношениями "один ко многим" и "многие ко многим".
Например, таблица с именем users может иметь поле массива с именем "favorite_colors" , или может быть отдельная таблица с именем "favorite_colors" и таблица соединений между "пользователями" и "favorite_colors" .
В каких случаях тип данных массива ОК для использования вместо полномасштабного соединения?
Ответы
Ответ 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
и получение опций с помощью объединения.