我在架构中做错了吗?

时间:2015-02-07 15:29:24

标签: mysql sql database database-design

我设计了一个数据库架构,允许使用Facebook风格的消息系统(没有能够编辑消息的功能)。这是:

enter image description here

我的想法是用户向对话发送消息,而不是向其他用户发送消息。这样,用户就可以订阅会话,从而实现多种用户风格的聊天。

conversation就像一个房间。如果用户 bob 和用户 joe 开始交谈,则会创建一个会话,如果不存在的话。每当“bob'和'乔#39;说他们的消息将始终具有相同的conversation_id。这将允许我通过使用conversation_id获取所有消息来返回所有通信。

多个用户可以是conversation的一部分。 conversation_users表存储了conversation_iduser_id,这使我可以查询表格以获取All users who have the conversation_id X

我遇到的问题是我想查询:Give me the conversation_id used by Joe and Bob,因此我可以使用此conversation_id返回“Joe'之间的所有消息”。和鲍勃'

我怎么能实现这个目标?我想我已经错过了我的模型中的重要内容,这使得它看起来比它需要的更复杂。但我无法看清楚。

1 个答案:

答案 0 :(得分:1)

您需要Joe和Bob使用的conversation_id值的交集。

如何获得Joe使用的conversation_id值?

          SELECT cu.conversation_id
            FROM Users u
            JOIN Conversation_Users cu ON u.id = c.user_id
           WHERE username = 'Joe'

你为Bob做同样的事,给你两个子查询。验证这些;确保它们正常工作。

然后你这样做:

SELECT cu.conversation_id
  FROM Users u
  JOIN Conversation_Users cu ON u.id = c.user_id
 WHERE username = 'Joe'
   AND cu.conversation_id IN
       (
          SELECT cu.conversation_id
            FROM Users u
            JOIN Conversation_Users cu ON u.id = c.user_id
           WHERE username = 'Bob'
       )

它会为您提供涉及两个用户的会话ID列表。 修改 JOIN也可以处理此逻辑。

SELECT a.conversation_id
  FROM (SELECT cu.conversation_id
          FROM Users u
          JOIN Conversation_Users cu ON u.id = c.user_id
         WHERE username = 'Joe'
           AND cu.conversation_id
       ) a
  JOIN (  SELECT cu.conversation_id
            FROM Users u
            JOIN Conversation_Users cu ON u.id = c.user_id
           WHERE username = 'Bob'
       ) b ON a.conversation_id  = b.conversation_id

第一个查询可以放在MySQL视图中,而第二个查询则不能。哪一个更快?很难知道他们两个都没试过。

可能会有多个此类对话。如果你只想要一个,你将不得不弄清楚如何选择它。

您没有遗漏任何模型。只是因为MySQL没有INTERSECTION运算符,所以这种交集操作的逻辑变得微妙。