聊天室应用程序的数据库设计

时间:2014-08-08 11:43:19

标签: mysql database-design chat

修改

人们认为这个问题过于宽泛,所以我在这里缩小范围:

我有一个包含双主键的表:roomID和userID。

以下是一些示例数据:

roomID |用户ID

1 | 5

1 | 9

1 | 10

1 | 12

2 | 5

2 | 9

2 | 10

3 | 5

3 | 17

鉴于用户列表:5,9,10,如何返回仅包含这些用户的roomID?所以在这种情况下它应该返回2。

我希望这可以在1个SQL查询中完成。

任何帮助都会被贬低。


原始问题

我正在制作一个聊天室应用程序,需要为它设计一个数据库后端。所有房间都是动态创建的,当最后一个用户离开房间时会被销毁。用户可以将其他用户添加到他们所在的任何房间。

目前这是我的设计:

我有一个有两列的聊天室表。这两列都是表的主键(因此只有当两列相同时才认为行是重复的)。第一列是房间ID。第二列是用户ID。我在这里的想法是使用相同的房间ID,这个房间里可以有很多用户(所以具有相同房间ID但用户ID不同的行)。当我需要创建一个新房间时,我只需选择MAX(房间ID)+ 1并创建一个带有此ID的新房间并将用户添加到其中。

鉴于用户ID列表(例如1,5,31,12),我需要查明是否已为他们创建了房间。换句话说,我需要确定是否所有具有相同房间ID的行具有用户ID 1,5,31,12。但是,如果使用用户1,5,31,12,6(一个或多个额外用户)创建房间,则不应将其视为已创建的房间。然后我需要为他们创建一个新房间并将用户添加到该房间。对于比列表更少的用户也是如此。

现在我无法形成查询以确定是否需要创建新房间,如果没有,则检索现有房间的房间ID。

任何帮助都将不胜感激。

另外,我认为这个设计非常麻烦,欢迎您建议更好的数据库设计。

P.S。我使用的数据库是MySQL

1 个答案:

答案 0 :(得分:0)

我认为yoy可以在聊天室表中添加1个col,名称为num_member,这是房间中的成员数(或者更好的有room(room_id,number_member)表)。为了简单起见,我假设你在聊天室中有num_member。此查询可能有效:

Select * From chatroom where user_id IN ($userIdList) Group by room_id HAVING count(*) = chatroom.num_member

希望这个帮助