Laravel Livechat系统数据库设计

时间:2020-07-31 23:42:27

标签: php mysql laravel message-queue livechat

Laravel 7.0版,MySQL 5.8版

我要为实时聊天系统设计数据库。 这是相关的模型和表格。

User模型-users表(id, name, email, address..

Guest模型-guests表(id, name, ipAddress

Team模型-teams表(id, name, image

team_has_usersid, team_id, user_id

用户应该能够向UserTeamGuest发送消息。


以下是我可能想到的情况。

  • 第一种方法

messsages表(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_idread的状态对我来说有点棘手。

有人可以帮助我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

模型UserGuestTeam看起来也不错。

但是,如果您要跟踪用户为什么看到Message,则需要对其进行跟踪。
为此,message_from_to需要一个team_id:

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

如果是定向消息或包含Team id,则将为null。

PS:您仍然需要from_modelto_modelmessage_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

UserGuest应该实现相同的类。
雄辩地,您可以做到:

$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