Личные сообщения - давайте расставим точки.

1 234
nomarketing
На сайте с 23.09.2009
Offline
189
#31
master32 #:
  • Если цель похожего на классический чат один на один, вы можете реализовать дополнительную логику в приложении для создания диалога, когда два пользователя впервые начинают общаться.
  • Для оптимизации работы можно добавить индексы на поля conversation_id, sender_id, created_at.
  • Дополнительная таблица «сообщений прочитанных» может быть реализована для отслеживания статуса прочтения для конкретного пользователя в конкретном чате (например, если требуется хранить отметку для каждого участника в группе).

Ниже приведён SQL-пример создания таблиц (пример на PostgreSQL):


-- Таблица пользователей

CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );


-- Таблица диалогов (бесед)

CREATE TABLE conversations ( id SERIAL PRIMARY KEY, name VARCHAR(100), is_group BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );


-- Таблица участников беседы (связующая таблица)

CREATE TABLE conversation_participants ( conversation_id INTEGER NOT NULL REFERENCES conversations(id) ON DELETE CASCADE, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (conversation_id, user_id) );


-- Таблица сообщений

CREATE TABLE messages ( id SERIAL PRIMARY KEY, conversation_id INTEGER NOT NULL REFERENCES conversations(id) ON DELETE CASCADE, sender_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, message_text TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, status VARCHAR(20) DEFAULT 'sent' );


-- Индексы для ускорения выборок (опционально)

CREATE INDEX idx_messages_conversation ON messages(conversation_id); CREATE INDEX idx_messages_sender ON messages(sender_id);


-- Дополнительно можно создать таблицу для статуса чтения сообщений отдельным пользователям

CREATE TABLE message_read_status ( message_id INTEGER NOT NULL REFERENCES messages(id) ON DELETE CASCADE, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, read_at TIMESTAMP, PRIMARY KEY (message_id, user_id) );

Эта схема позволяет:

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

Как это понять для групповых чатов ?

Нужно только 2 собеседника в 1 чате.

К примеру user1 написал user2, user 2 ответил user 1. - далее удаление у себя сообщение удалили к примеру 2 пользователя то оно удаляется автоматом из БД у обоих пользователей.

Видите не все так просто

Капитан покидает корабль последним
nomarketing
На сайте с 23.09.2009
Offline
189
#32
nomarketing #:

Как это понять для групповых чатов ?

Нужно только 2 собеседника в 1 чате.

К примеру user1 написал user2, user 2 ответил user 1. - далее удаление у себя сообщение удалили к примеру 2 пользователя то оно удаляется автоматом из БД у обоих пользователей.

Видите не все так просто

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

Пусть проект будет не большим но вполне рабочим с минимум "старой инфы" на примере удаления юзерами сообщений что равно удаление их из БД

S3
На сайте с 29.03.2012
Offline
340
#33
nomarketing #:

К примеру user1 написал user2, user 2 ответил user 1. - далее удаление у себя сообщение удалили к примеру 2 пользователя то оно удаляется автоматом из БД у обоих пользователей.

Видите не все так просто

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

nomarketing
На сайте с 23.09.2009
Offline
189
#34
Sly32 #:

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

У меня в этом практики ноль, но, могу разобраться в прочем что и делаю.

Мне нужна некая простая база (рабочая) чтобы наглядно было, потом уже проще будет.

S3
На сайте с 29.03.2012
Offline
340
#35
nomarketing #:

Как это понять для групповых чатов ?

Нужно только 2 собеседника в 1 чате.

Ну и упрости уже сам

png screenshot_2025-04-21_at_08.55.31.png
S3
На сайте с 29.03.2012
Offline
340
#36
nomarketing #:

У меня в этом практики ноль, но, могу разобраться в прочем что и делаю.

Мне нужна некая простая база (рабочая) чтобы наглядно было, потом уже проще будет.

Рабочая база - это сесть и почитать про базы данных. Как устроены, что умеют. Без этого приведенные примеры тебе ничего не дадут.

Зная основы, тебе уже будет абсолютно все равно на чем реализовывать - вордпрессе, или Питоне.

E
На сайте с 01.10.2017
Offline
111
#37
master32 #:
пример на PostgreSQL

Без кавычек у идентификаторов современный MySQL должен это понять. BOOLEAN DEFAULT FALSE и т.п. сейчас для него не проблема.

А про форматирование выше уже написали. Это даже вручную нетрудно отформатировать.

Домены на продажу: https://p20.ru/collection/domains-for-sale
S3
На сайте с 29.03.2012
Offline
340
#38
ну а примеры?

Вот кстати хороший пример этот флудер. Он старается, шлепает мессджи, думая что загадит весь форум. 

Что думаешь, админ проснется и будет ручками выпиливать все? Нет, достаточно удалить юзера. Все сообщения каскадом удаляться из базы тоже. Когда БД поддерживает принципы ACID - это не вызывает сложностей. MySQL  его поддерживает частично, а вот POSTGRSQL - полностью. Там каскадные связи строить проще.

M3
На сайте с 09.02.2022
Online
80
#39
estic #:
современный MySQL

кстати почти полностью отказался от MySQL в пользу SQLite + nvme)

1 234

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий