0

我的问题比示例更笼统,但我认为说明这个想法的唯一方法是使用示例。

假设我想为聊天应用程序创建一个数据库。会有一个主题列表。任何“房间”4 个用户在任何时间。

假设有一个话题叫“贝多芬”。如果用户选择该主题,则会获取或创建一个房间。一旦 4 个用户加入了该房间,就会创建房间的另一个实例(相同主题),在创建另一个实例之前最多需要 4 个用户。如果第一个房间实例的用户离开,则该槽是打开的,因此加入主题的第 9 个用户将被发送到第一个房间实例。

管理此问题的最佳方法是什么?我有两个想法:

  1. “主题”表:id、标签
  2. “房间”表:id、topicId
  3. “人口”表:roomId、userId

当用户选择/加入一个主题时,例如SELECT COUNT(userId) FROM Population WHERE topicId = <id>... 如果 count > 4,创建一个新 Room,将其插入并返回插入 ID。当用户离开房间时,会删除 Population 中的该行。

或者...

  1. “主题”表:id、标签
  2. “房间”表:id、topicId、user1、user2、user3、user4。

然后当用户加入时,类似SELECT id FROM Rooms WHERE ISNULL(user1) OR ISNULL(user2) OR ISNULL(user3) OR ISNULL(user4) LIMIT 1

如果没有匹配的行,则插入一个新 Room 并返回插入 ID。当用户离开房间时,该列设置为 NULL。

蒂亚。

4

1 回答 1

0

我使用了你的第一个模式。

获取未满房间的列表:

SELECT room.id
FROM       topic
INNER JOIN room       ON room.topic_id = topic.id
INNER JOIN population ON population.room_id = room.id
WHERE topic.label = 'purcell'
GROUP BY room.id
HAVING COUNT(*) < 4

如果没有找到这样的房间,则获取第一个未满的房间 id 或 NULL:

SELECT MIN( room_id )
FROM (
  SELECT room.id AS room_id
  FROM       topic
  INNER JOIN room       ON room.topic_id = topic.id
  INNER JOIN population ON population.room_id = room.id
  WHERE topic.label = 'purcell'
  GROUP BY room.id
  HAVING COUNT(*) < 4
) AS non_full_rooms
于 2012-11-06T23:54:39.460 回答