我正在为 Web 应用程序创建一个线程消息传递系统,就像在 Facebook 的消息传递系统中一样。我在 StackOverflow 中遵循了线程消息的其他数据库方案,但我没有在他们的要求中看到我的要求。
所以我有三张桌子:
Conversations
- conversationId
Messages:
- messageId
- conversationId
- body
Participants
- conversationId
- userId
Conversations
如果用户创建新对话,则在表中创建新的对话记录。消息的正文以及随后的回复都存储在Messages
带有 conversationId 的表中。最后,将参与者(发送者和 1 个或多个接收者)添加到Participants
表中。
例如,A 人向 B 人发送消息。如果 A 和 B 之间的对话尚不存在,则应创建一个具有新 ID 的新对话。但是如果 A 和 B 已经有一条记录,它应该只是将消息添加到Messages
具有现有对话 ID 的表中。如果 A 发送 B 和 C,那是一个新线程,不应包含在最后一次对话中。
如果用户创建一个新的对话给他已经有过对话的人(人 A 和 B 已经有一个现有的对话),消息传递应用程序不应该创建另一个对话 Id,而只是获取所有参与者都存在的对话 Id。
我想知道的是如何找出我应该将新消息附加到哪个对话。我应该如何制定我的查询以获取与确切参与者的对话 ID?如果参与者的 userIds 不匹配,它应该返回 0。是否有更好的数据库方案来满足我的要求?