LINUX.ORG.RU

[СУБД][Postgres] Хорошо ли использовать массив?

 


0

1

Есть три таблицы: пользователи, агентства, офисы.
Каждый пользователь может принадлежать одному агентству и нескольким офисам этого агентства.

Вопрос: как сохранить эти связи в БД? Отдельными таблицами типа Users2OfficesMatrix или использовать тип integer[]?

★★

Ответ на: комментарий от SaBo

представь что в офисе хотя бы 100 пользователей что все хранить в массиве? а 1000? а как искать раз не select'ом конкретного пользователя и апдейтить? а где индексы для этих связей? вообщем не для связи таблиц оно

quest ★★★★
()
Ответ на: комментарий от SaBo

Твой массив може участвовать в SQL-запросах? Где он будет храниться? Все ли юзеры будут его видеть?

aydar ★★★★★
()

смотря что чаще делается смотря какие выборки

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

namezys ★★★★
()
Ответ на: комментарий от quest

> представь что в офисе хотя бы 100 пользователей что все хранить в массиве?

Можно хранить массив не в таблице с офисами, а в таблице с пользователями. Тогда в этом массиве будет максимум 1-3 значения.

а где индексы для этих связей?

С этим аргументом согласен.

вообщем не для связи таблиц оно

А для чего?

SaBo ★★
() автор топика

если данных будет много, то many2many через промежуточную таблицу, если не очень - то массив.

а если данных будет __очень__ много, то лучше денормализация и plain table с избыточным хранением данных, но возможностью простого выбора всех данных практически по одному ключу.

real_maverick ★★★
()
Ответ на: комментарий от namezys

> денормализация часто сказывается положительно, но не всегда, ибо обновлять такие данные сложно

Ну меня подкупает, что править ручками это будет проще.

P.S. Я то вообще всегда таблицы ля связи использовал, но вот в постгресе не силён.

SaBo ★★
() автор топика
Ответ на: комментарий от real_maverick

> если данных будет много, то many2many через промежуточную таблицу, если не очень - то массив.

Не очень 2-3 значения. Но это сейчас. В будущем же может быть что угодно де угодно :)

SaBo ★★
() автор топика

Используйте таблицы, как в школе учили.

Денормализация и запихивание данных в массив нужно, когда начинаются проблемы с быстродействием. Судя по «пользователи, агентства, офисы», проблемы с быстродействием в этом приложении не начнутся никогда.

Kpoxman ★★
()

>Вопрос: как сохранить эти связи в БД? Отдельными таблицами типа Users2OfficesMatrix или использовать тип integer[]?

Вполне можно использовать массивы. Они в pgsql быстрые, по ним можно строить индексы, работать с ними просто (в документации есть операторы для работы с ними - там на все случаи жизни).

anonymous
()
Ответ на: комментарий от anonymous

> Вполне можно использовать массивы. Они в pgsql быстрые, по ним можно строить индексы, работать с ними просто (в документации есть операторы для работы с ними - там на все случаи жизни).

И потеряйте foreign keys и прочие фичи RDBMS.

Kpoxman ★★
()
Ответ на: комментарий от SaBo

> править ручками это будет проще

И что, часто вы в БД правите данные «ручками»?

Идея с хранением М2М связей в массиве - ужасна. Вы же, я думаю, и без меня знаете, что означает R в RDBMS.

Есть смысл использовать массивы при денормализации, как уже выше было сказано, но только если у вас есть на это действительно серьезные причины. «Удобство ручной правки» - не причина.

shylent
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.