PostgreSQL: структура базы данных для чата - PullRequest
0 голосов
/ 05 октября 2018

Я создаю стол для разговора в чате.Вместо создания 2 таблицы: Диалог и сообщение .Я просто проектирую 1 таблицу: Разговор и использую JSONB поле для сообщения.

Вы, ребята, проверяете это фото:

enter image description here

Естьэто решение структуры базы данных хорошо или плохо?И если это плохо, есть ли другие решения для меня?

1 Ответ

0 голосов
/ 05 октября 2018

Я бы настоятельно рекомендовал нормализовать структуру вашей таблицы.

Участники должны перейти в отдельную таблицу с колонками id_conversation и id_user.Это было бы лучше для поиска и обновления, чем использование массива (json).

То же самое с messages.Почему бы не хранить их в отдельной таблице со столбцами id_conversation, timestamp, id_user, message_text?Это было бы гораздо лучше для поиска и обновления.И это делает вашу таблицу разговоров намного меньше.


В добавление : Для чего этот столбец participants?Если у вас есть сообщения для каждого разговора, вы можете легко запросить в таблице всех пользователей, которые отправили сообщение в разговор, например,

SELECT DISTINCT id_user FROM messages WHERE id_conversation = 42

Редактировать :

Принципиально: наборы данных 1M - это много, но не гигантская таблица.У Postgres с хорошим дизайном стола проблем не должно быть.Но я предполагаю, что в одном разговоре гораздо меньше сообщений, поэтому вы можете многое сделать с фильтрацией и индексацией.

1.Я настоятельно рекомендую подумать о некоторых умных индексах для ваших таблиц, которые должны сделать поиск действительно быстрым.Может быть, поможет индекс по временным меткам сообщения и один по идентификаторам конверсии:

CREATE INDEX idx_messages_timestamp
ON messages (timestamp);

CREATE INDEX idx_messages_conversations
ON messages (id_conversation);

Если вы хотите получить новые сообщения, может быть полезно создать индексы с порядком DESC (... ON messages(... DESC))

2.Для действительно огромных таблиц (я имею в виду ДЕЙСТВИТЕЛЬНО огромные таблицы) может быть полезно разбить на него.Это разбивает вашу таблицу внутри по определенному критерию - возможно, по метке времени (например, ежемесячно или ежегодно).Так что если вы в основном выбираете более новые данные, старые будут заархивированы в отдельных таблицах внутри.Таким образом, запрос находится только в строках запрошенной таблицы меньшего размера.

Но это своего рода продвинутый : https://www.postgresql.org/docs/current/static/ddl-partitioning.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...