LINUX.ORG.RU

Реализация «групп»

 


0

1

Есть абстрактный веб-сервис, в нём есть пользователи, есть группы пользователей.

Вопрос, как это правильнее реализовать на уровне БД и почему?

Вариант 1.
------------------

В таблице `users` есть массив `groups[]`, в котором указаны группы, к которым принадлежит пользователь;


Вариант 2.
------------------

В таблице `groups` есть массив `users[]`, в котором перечислены члены группы;

★★★★☆

Первый вариант вполне валиден, если тебе не нужно выбирать юзеров состоящих в группах, а только нужно знать группы конкретного юзера. Второй вариант не годится ни при каких раскладах.

Вариант 3: табличка с парами user_id и group_id.

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

если тебе не нужно выбирать юзеров состоящих в группах

а в чем проблема?

Но классический вариант таки m2m

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

Индексы то можно строить. Запрос даже прикольней выглядит

session.query(User).filter(User.groups.contains(['admin'])).all()

Array скорее хренов тем, что информацию о группах то всё равно придется где-то хранить. И такая операция как удаление группы или переименование станет не такой простой.

pawnhearts ★★★★★
()
Последнее исправление: pawnhearts (всего исправлений: 2)
Ответ на: комментарий от pawnhearts

Индексировать массивы без веской причины — так себе идея. Да и табличка с парами будет быстрее в любом случае.

Но если это не нужно, я бы ради простоты предпочёл иметь массив групп.

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

С джойном запрос будет выглядеть не хуже. Ну и мб ORM там вовсе не нужен. Плюс выглядеть он может сильно хуже алхимии в зависимости от языка.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)

все чушь. тебе нужна таблица соответствия и два справочника. таблица соответствия вида id, gid, uid, etc...

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

Так чем это не второй вариант?

annerleen ★★★★☆
() автор топика

Таблица groupxusers / usergroup / etc, где будет id,iduser,idgroup
Почему? Потому что в в.1 как ты будешь выбирать всех юзеров по группе? В в.2 как ты будешь выбирать все группы юзера?
/thread

crutch_master ★★★★★
()

А потом тебе захочется чтобы группа могла состоять не только из юзеров, но еще и из групп.

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

Допустим, хотим добавить флаг «активности» группе, и выбрать только активные. Как это будет выгядеть?

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

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

level1 ★★
()

В таблице `users` есть массив `groups[]`,

Head shot.

В таблице `groups` есть массив `users[]`, в котором перечислены члены группы;

Double kill....

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

А потом тебе захочется чтобы группа могла состоять не только из юзеров, но еще и из групп.

Или группы в виде дерева. Уже представил как он будет удалять одну из групп в середине со своими массивами.

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

В том, что у тебя всегда будет перебираться вся таблица на каждый запрос. И давай, теперь придумай, как выбрать всех юзеров у которых группа есть с каким-нибудь атрибутом, типа «разработчик» (куда входят программисты, тестировщики, девопсы, etc)

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

Откуда это требование вообще появилось

Вот отсюда:

Есть абстрактный веб-сервис

У тебя сложности?

crutch_master ★★★★★
()

А битовые маски не предлагают. Наверное не по фэн-шую, но я обычно одним целым полем у пользователей обхожусь. Вставил бит, снял бит, сравнил с маской. Легко и просто. Если каких-то очень сложных вложенностей не планируется.

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

Те же самые проблемы, что и с массивом. Выбор всех пользователей группы будет перебирать всю таблицу + расширение сущностей. Ну, если их 10-50, то какая разница, конечно.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от level1

Зачем такой гемор? 5 табличек юзерс, групс, юзерсгрупс, пермишнс, групспермишнс. Все. Хоть обджойнься

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Колво битов конечно

) То, что ими надо сортировать, обычно, еще раньше конечно.

Строго говоря в рабочем варианте это используется только для эмуляции RowLevelSecurity в PostgreSQL 9.4 (в котором еще не было встроенного). Везде где можно - настоящие Postgres пользователи и их Postgress группы. А для RLS - битовые маски на пользователей и их записи. И доступ не к таблицам, а к представлениям, с маской.

Ну, и в нерабочем баловстве в интернетах так делаю, когда уверен, что биты не кончатся раньше.

Спасибо, поговорил )

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

Это если речь только о пользователях. А вот например фильтры товаров битовыми масками не наделаешь. Тщем, ограничение чревато и у пользаков. А то что для бизнес логики «продукта» используются пользаки и группы БД — тоже не хорошо. Я не спорю что удобно, но не хорошо. Мух от котлет отделять все же надо.

deep-purple ★★★★★
()

В таблице X есть массив Y

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

no-such-file ★★★★★
()
Ответ на: комментарий от deep-purple

Мух от котлет отделять все же надо.

Наверное у нас разные представления о мухах и котлетах )

Приложение полностью написанное на PostgreSQL, использующее все доступные и необходимые возможности этой СУБД, в том числе по пользователям/группам - это котлета. Легко переносимая, независящая от внешнего мира.

А интерфейс пользователя и прокладка между СУБД и интерфейсом - это мухи, которые могут меняться по цвету и вкусу.

Как-то так рассуждал.

Deleted
()

Пользователи и группы - это связь many2many. Такая связь делается через промежуточную таблицу. Теоретически, можно сделать и через массивы. Но, во-первых, ты не сможешь построить unique constraint, что один пользователь принадлежит одной группе только один раз, во-вторых, индексировать массив можно, но лучше не нужно.

nikolnik ★★★
()
Последнее исправление: nikolnik (всего исправлений: 1)
Ответ на: комментарий от Deleted

Я говорю — удобно. Однако это не котлета, а муха. Но на вкус и цвет фломастеры разные, поэтому останемся каждый на своём.

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