【问题标题】:Database design for chatroom application聊天室应用的数据库设计
【发布时间】:2014-10-01 21:19:52
【问题描述】:

编辑

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

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

以下是一些示例数据:

房间ID |用户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(room ID) + 1 并使用此 ID 创建一个新房间并将用户添加到其中。

给定一个用户 ID 列表(例如 1、5、31、12),我需要确定是否已经为他们创建了房间。换句话说,我需要确定是否存在所有具有相同房间 ID 且用户 ID 为 1、5、31、12 的行。但是,如果一个房间是由用户 1、5、31、12、6(一个或多个额外用户)创建的,这不应算作已创建的房间。然后我需要为他们创建一个新房间并将用户添加到其中。对于少于列表的用户也是如此。

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

任何帮助将不胜感激。

另外,我觉得这个设计比较麻烦,欢迎大家提出更好的数据库设计。

附:我使用的数据库是 MySQL

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于设计批评
  • 措辞有误。我认为主要问题是:如何在 MySQL 中比较两组。不过,询问数据库设计的部分有点离题。

标签: mysql database-design chat


【解决方案1】:

我认为 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

希望有帮助

【讨论】:

  • 这意味着当我在房间中添加/删除成员时,我必须跟踪房间中有多少用户。这个好像有点麻烦,有什么办法可以避免吗?
  • 如果您想在不需要计算的情况下获得总成员数,保留成员数将很有用。
猜你喜欢
  • 2016-04-21
  • 2018-01-16
  • 2017-09-19
  • 2017-10-23
  • 1970-01-01
  • 2021-04-02
  • 2019-06-12
  • 2023-03-24
  • 2019-02-12
相关资源
最近更新 更多