PostgreSQL:聊天对话的数据库结构

Kit*_*Kit 0 database postgresql database-design

我正在设计一个用于聊天对话的表格。而不是创建 2 个表:Conversation 和 Message。我只设计了 1 个表:Conversation and use JSONBfield for Message。

你们看看这张照片:

在此处输入图片说明

这个数据库结构解决方案是好是坏?如果情况不好,是否还有其他解决方案适合我?

S-M*_*Man 6

我强烈建议规范化您的表结构。

参与者应进入带有列id_conversation和 的单独表格id_user。搜索和更新比使用 (json) 数组更好。

messages. 为什么不将它们存储到一个单独的表中,其中包含列id_conversation, timestamp, id_user, message_text?它也可以更好地用于搜索和更新。它使您的对话桌小得多。


另外:那participants列是做什么用的?如果您有每个对话的消息,您可以轻松地向表格询问所有向对话提交消息的用户,例如

SELECT DISTINCT id_user FROM messages WHERE id_conversation = 42
Run Code Online (Sandbox Code Playgroud)

编辑

原则上:1M数据集虽多,但不是一张大表。具有良好表设计的 Postgres 不应该有任何问题。但我假设一个对话的消息要少得多,因此您可以通过过滤和索引做很多事情。

1. 我强烈建议为您的表考虑一些聪明的索引,这应该可以使搜索非常快速。也许消息时间戳上的索引可能会有所帮助,而转换 ID 上的索引可能会有所帮助:

CREATE INDEX idx_messages_timestamp
ON messages (timestamp);

CREATE INDEX idx_messages_conversations
ON messages (id_conversation);
Run Code Online (Sandbox Code Playgroud)

如果您想获取较新的消息,使用DESC订单 ( ... ON messages(... DESC))创建索引可能会有所帮助

2. 对于非常大的表(我的意思是非常大的表),对它进行分区可能会有所帮助。这会根据某个标准在内部拆分您的表格 - 可能是时间戳(例如,每月或每年)。因此,如果您主要获取一些较新的数据,则较旧的数据将在内部存档在单独的表中。因此查询仅针对请求的较小表的行。

但这有点高级https : //www.postgresql.org/docs/current/static/ddl-partitioning.html