gpt4 book ai didi

php - 带房间的实时聊天项目的数据库模式

转载 作者:行者123 更新时间:2023-11-29 01:45:14 25 4
gpt4 key购买 nike

对于我的大学项目,我正在开发一个包含房间、用户注册等功能的动态实时聊天网站。除了一个方面,我已经计划好了整个系统。房间。

一个房间是由一个用户创建的,而这个用户又是那个房间的运算符(operator)。用户可以加入房间并在其中交谈。该系统必须具有可扩展性,即使不能每天发送数百万条消息,也能处理数十万条消息。

我打算在我的数据库中创建名为 messages 的表,并具有如下字段:

| r_id | u_id |留言 |时间戳 |

r_idu_id 分别是房间 ID 和用户 ID 的外键。这意味着我会在用户发送消息时插入一条新记录,并定期为每个客户端运行一个 SELECT 语句(比如每 3 秒左右)以获取最近的消息。但是由于表很大,运行这些语句可能会产生大量开销并花费很长时间。

另一种实现方法是为每个房间创建一个新的数据库表。假设用户创建了 3 个房间,分别是 GeneralProgrammingGaming。数据库表将是 room_generalroom_programmingroom_gaming,每个表的字段如下:

| u_id |留言 |时间戳 |

这会大大减少每个表的查询量,但可能会在我对其进行编程时引入问题。

那么,最好的方法是什么?

我将 MySQL 与 PHP 和 AJAX 结合使用。

最佳答案

每个房间创建一张 table 是个坏主意。难以实现和支持。

不要担心选择的性能,因为它们会非常简单:

SELECT * FROM messages WHERE r_id=X ORDER BY timestamp DESC LIMIT X,Y

只需确保您的 (r_id, timestamp) 按此顺序索引在一起,以便使用索引进行此选择:

ALTER TABLE `messages` ADD KEY `IN_messages_room_time` (`r_id`, `timestamp`);

如果您仍然遇到性能问题(可能不会),只需在内存缓存中添加 1-3 秒(使用 memcache)并每 1-3 秒从数据库中获取一条消息。

另请参阅 Apollo ·克拉克的回答:https://stackoverflow.com/a/8673165/436932为了防止存储大量不必要的旧消息:您可以将其放入 MYISAM 表 archive 或简单地删除。

关于php - 带房间的实时聊天项目的数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8672989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com