Laravel Дизайн базы данных системы LiveChat - PullRequest
0 голосов
/ 01 августа 2020

Laravel версия 7.0, MySQL версия 5.8

Я собираюсь разработать базу данных для системы livechat. Вот соответствующие модели и таблицы.

User модель - users таблица (id, name, email, address..)

Guest модель - guests таблица (id, name, ipAddress)

Team модель - teams таблица (id, name, image)

team_has_users (id, team_id, user_id)

Пользователь должен иметь возможность отправлять сообщения на User, Team, Guest.

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

  • первый подход

messsages table (id, content, from_id, to_id, from_model, to_model) // Я думаю, что этого недостаточно, чтобы сохранить read_status для каждого пользователя.

  • второй подход

messages таблица (id, content)

message_from_to таблица (id, message_id, from_id, to_id, read_status)

from_id будет id либо users таблицы, либо guests таблицы.

Но статус to_id и read для меня немного сложен.

Кто-нибудь может мне помочь?

Спасибо

1 Ответ

1 голос
/ 01 августа 2020

Модели User, Guest и Team мне тоже подходят.

Но если вы хотите отследить, почему пользователь видит Message, вам нужно отследить это. Для этого message_from_to нужен team_id:

$table->integer('team_id')->nullable();

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

PS: вам все еще нужно from_model & to_model в message_from_to, или вы знаете, для User или Guest.

Вот лучшая версия структуры базы данных:

users
    id
    name
    email
    ...

guests
    id
    name
    ipAdress

teams
    id
    name

(https://laravel.com/docs/7.x/eloquent-relationships#many-to-many)
team_user
    id_team
    id_user

(https://laravel.com/docs/7.x/eloquent-relationships#one-to-many)
messages
    id
    content
    from_id
    from_type
    team_id [nullable]

(https://laravel.com/docs/7.x/eloquent-relationships#one-to-many-inverse)
message_to
    id
    id_message
    to_id
    to_type
    read_status

User & Guest должны реализовывать тот же класс. С красноречием вы могли бы сделать:

$user->messages(); // return all message
$message->from(); // return User or Guest instance
$message->to(); // return User & Guest array
$message->isRead(Guest|User); // retourn boolean
$message->hasTeam(); // retourn boolean

Возможно чаевые: https://laravel.com/docs/7.x/eloquent#query -scopes

...