172 похожих чатов

Есть таблицы: 1) user 1) group_chat 2) group_chat_member 3) message каждый юзер должен иметь

возможность удалять сообщения в групповом чате ТОЛЬКО ДЛЯ СЕБЯ

вижу два варианта как это реализовать
1) храним в group_chat_member array айдишников сообщений которые юзер удалил у себя(при получении списка сообщений придется джоинить таблицу messages с таблицей group_chat_member)
2) храним в каждом сообщении array айдишников юзеров которые удалили у себя это сообщение(при получении списка сообщений придется проверять каждое сообщение)

представим что максимальное количество участников группы 5000 человек и неограниченное количество сообщений

тип колонки message_id - bigint
тип колонки user_id - bigint

как думаете какой варик разумнее заюзать?

5 ответов

9 просмотров
Артем- Автор вопроса

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

1) Не использовать array без веской причины. Это не 1НФ, у вас должно быть прилично опыта и чёткое (с числами) описание проблем, чтобы такое городить. 2) Использовать, конечно, таблицу многие-ко-многим (пользователи-сообщения) в классическом виде.

Артем- Автор вопроса
Ilya Anfimov
1) Не использовать array без веской причины. Это н...

1нф далеко не везде используется где важна скорость выполнения запроса

Артем- Автор вопроса
Артем
Причина - важна скорость

У вас пока что нет способов это определить (нехватит опыта). Если бы хватало — вы бы задавали другие вопросы, и, скорее всего, знали как это посчитать численно. В большынстве случаев использование массивов замедляет работу системы. В частности, в вашэм в постгрессе — это сильно замедлит.

Похожие вопросы

Обсуждают сегодня

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
Есть предложения, как подобное можно упростить?
Hemul GM
12
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
9
@y0zhig @shizzard А можно я опишу цель и может вообще ерланг мне не подходит. На текущий момент как я понимаю у ерланга есть легковесные потоки и задача выполняется в каком т...
Дмитрий Спиридонов
5
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
just use free version ?? pycharm has a free version
Fan / Ac
9
Карта сайта