我的问题比示例更为笼统,但我认为说明这个想法的唯一方法是使用样本。
假设我想为聊天应用程序创建数据库。将有一个主题列表。任何时候任何“房间”4个用户。
说有一个名为“贝多芬”的话题。如果用户选择该主题,则提取或创建房间。一旦有4个用户加入该房间,就会创建另一个房间实例(同一主题),在创建另一个实例之前最多需要4个用户。如果第一个房间实例中的用户离开,则该插槽已打开,因此加入该主题的第9个用户将被发送到第一个房间实例。
管理此问题的最佳方法是什么?我有两个想法:
当用户选择/加入主题时,类似SELECT COUNT(userId) FROM Population WHERE topicId = <id>
...如果计数&gt; 4,创建一个新的Room,插入它并返回插入id。当用户离开房间时,人口中的该行将被删除。
或者...
然后当用户加入时,如SELECT id FROM Rooms WHERE ISNULL(user1) OR ISNULL(user2) OR ISNULL(user3) OR ISNULL(user4) LIMIT 1
如果没有匹配的行,请插入一个新的Room并返回插入ID。当用户离开房间时,该列设置为NULL。
TYIA。
答案 0 :(得分: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