我试图设计一个既能进行私有聊天又能进行群组聊天的数据库模式.以下是我到目前为止得到的信息:

enter image description here

所以——理论上,即使用户只是在一对一的私有聊天中,他们仍然被分配了一个"室友",他们发送的每一条信息都会发送到那room

这是可以的,但是我觉得room桌有点多余,因为我并不真的需要房间名称,我可以省略它,只需使用participants桌和SELECT DISTINCT roomID FROM particpants桌来查找各个房间.

谁能告诉我一个更好的 struct ,或者为什么我应该保留房间的桌子?

推荐答案

您的模式看起来非常好,您可能会看到其他模式(包括今天的我)的 struct 与以前大致相同(Database schema for one-to-one and group chat06/1657819">Storing messages of different chats in a single database table、Database schema for one-to-one and group chatCreating a threaded private messaging system like facebook and gmail).我真的想指出,你的视觉表现是最好的,它很容易理解和遵循:)

总的来说,我认为拥有"聊天室"("chat"、"conversation")是有意义的,即使你目前没有特定的属性(可能是nameposting_allowedtype(也就是说,如果你不仅将类似的 struct 用于私有消息和聊天,也用于带有 comments 的公开帖子)等等.带有单个索引ID的单表应该非常快,开销几乎为零,但是它可以非常轻松地进行扩展,而无需修改所有现有代码(例如,有一天您决定在聊天中添加name).

Database相关问答推荐

如何正确创建mongo模型和客户端?

我们可以出于不同目的在同一 postgres 数据库上同时进行物理和逻辑复制吗?

无法初始化数据库,出现错误无法连接到`host=db user=database=`:拨号错误(dial tcp xxxx: connect: connection refused)

术语 SSTable 和 LSM Tree 有什么区别

Postgresql:优化数字字段的列大小

分布式数据库管理系统 (DDBMS) 中的水平与垂直碎片

在不稳定的网络中保持分布式数据库同步

用于 sql server 的免费国家、城市数据库

C# 连接到数据库并列出数据库

是否应该强制执行参照完整性?

在 SQL 数据库之间共享数据

是否有任何数据库支持自动索引创建?

如何产生幻读?

如何在一行中显示 redis 中的所有键?

当另一个进程修改数据库时Hibernate二级缓存失效

你可以在一个 Hibernate Session 中有多个事务吗?

如何在 Windows 中将用户添加到 PostgreSQL?

cURL 和 PHP 显示1

你如何记录你的数据库 struct ?

如何在 MySQL 中清理或调整 ibtmp1 文件的大小?