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

Как сохранить массив или несколько значений в одном столбце

Запуск Postgres 7.4 (Да, мы находимся в разгаре обновления)

Мне нужно сохранить от 1 до 100 выбранных элементов в одно поле в базе данных. 98% времени, когда он будет только один элемент, и 2% времени (если это), будет несколько элементов.

Элементы представляют собой не более чем текстовое описание (на данный момент) длиной не более 30 символов. Это статические значения, которые пользователь выбирает.

Требуется знать оптимальный тип данных столбца, используемый для хранения желаемых данных. Я думал о БЛОБЕ, но не знал, является ли это излишним. Может быть, JSON?

Также я думал об ENUM, но на данный момент я не могу этого сделать, так как мы запускаем Postgres 7.4

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

4b9b3361

Ответ 1

У вас здесь пара вопросов, поэтому я буду обращаться к ним отдельно:

Мне нужно сохранить несколько выбранных элементов в одном поле в базе данных

Мое общее правило: не надо. Это то, что требует все, кроме второй таблицы (или третьей) с внешним ключом. Несомненно, теперь это может показаться более простым, но что, если прецедент приходит, где вам нужно действительно запрашивать эти предметы отдельно? Это также означает, что у вас больше возможностей для ленивого создания экземпляра, и у вас есть более последовательный опыт работы с несколькими фреймворками/языками. Кроме того, у вас меньше шансов на тайм-аут подключения (30 000 символов много).

Вы упомянули, что думали об использовании ENUM. Установлены ли эти значения? Вы их заранее знаете? Если так, то это будет моя структура:

Базовая таблица (что у вас есть):

| id primary_key sequence
| -- other columns here.

Таблица элементов:

| id primary_key sequence
| descript VARCHAR(30) UNIQUE

Таблица карт:

| base_id  bigint
| items_id bigint

Таблица карт будет иметь внешние ключи, поэтому base_id будет сопоставляться с базой, а items_id будет отображаться в таблице элементов.

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

Какой формат следует использовать для хранения данных?

Если вам нужно сделать что-то подобное, почему бы просто не использовать символьную строку? Это займет меньше вычислительной мощности, чем CSV, XML или JSON, и это будет короче.

Какой тип столбца следует использовать для хранения данных?

Лично я использовал бы TEXT. Похоже, что вы сильно выиграли, сделав это BLOB, а TEXT, по моему опыту, легче читать, если вы используете какую-то форму IDE.

Ответ 2

В недавних версиях Postgres (не 100% от PG 7.4) существует тип массива . Вы можете даже индексировать их, используя индекс GIN или GIST. Синтаксис:

create table foo (
  bar  int[] default '{}'
);

select * from foo where bar && array[1] -- equivalent to bar && '{1}'::int[]

create index on foo using gin (bar); -- allows to use an index in the above query

Но, как предполагает предыдущий ответ, лучше нормально нормализовать.