我正在尝试使用 Qt5 开发我自己的简单聊天应用程序。
一些背景
到目前为止,我所拥有的是一个简单的服务器,它将接收来自用户(使用相应客户端)的任何消息并将它们与 from、to 一起存储在数据库中> 和 iseRead 字段。
然后客户端定期向服务器请求消息更新(我知道这可能不是一个好主意但我不确定我是否知道如何使用 Qt 查找谁在线所以请忽略它)并接收那些意味着的消息为他们。
我现在想要做的是添加一个功能,让用户不必专门从列表中选择其他人来发送消息,而是向所有人广播一些内容。将 ALL 值添加到我的 to 列不会有帮助,因为我不知道何时标记该消息的 isRead 字段,这会导致用户在每次客户请求时不断收到它。
如果我想添加向一群人发送消息的功能,事情也会变得更加复杂。
真正的问题
我如何构建我的服务器端数据库以高效地存储和检索我在上面描述的用户事务(向个人发送消息、向所有人广播、向群组等)?
我会不假思索地做这样的事情。
Users Table
unique_user_id, user_specific_info1, user_specific_info2, so on..
Messages Table
message, target_user_id, sender_id, message_status
现在我什至不会费心在数据库中存储 session 或群组消息等等。那只是无缘无故的额外开销。具有最少的服务器端代码以允许用户将彼此添加到聊天中并让客户端软件处理谁被邀请进入房间等。然后让客户端发送一条包含相关数据的消息:target_user_ids、消息、发件人 ID。
在服务器端逻辑中,获取消息,解析出目标 user_id,为每个目标 user_id 在 messages 表中创建一个新条目,并将状态设置为未读,一旦您的服务器软件已将状态翻转为已读成功将消息数据传输到目标用户id。
简单。这解决了您所有的群聊消息、向绝对所有人广播等问题。
更新
现在显然你会想要优化它。例如,您可能真的不想复制和存储广播中发给每个用户的每条消息的数据,因此您可以在此处创建一个独立的 Messages
表来保存原始数据具有自动递增唯一索引的消息内容,然后可能有第二个消息状态表,如下所示:
Messages Status Table
message_id, target_user_id, sender_id, message_status
现在您可以让 10000000 人收到相同的消息,但您只存储了对消息 ID 的引用 10000000 次,而不是整个消息数据。然后,您还可以有一个 cron 作业,然后每天在您的服务器上运行一次,或者从您的系统中清除所有状态为 READ 的消息,以避免膨胀。