0

私の質問は例よりも一般的ですが、アイデアを説明する唯一の方法はサンプルを使用することだと思います。

チャットアプリケーション用のデータベースを作成したいとします。トピックのリストがあります。一度に4人のユーザーの「部屋」。

「ベートーベン」というトピックがあるとしましょう。ユーザーがそのトピックを選択すると、部屋が取得または作成されます。4人のユーザーがその部屋に参加すると、部屋の別のインスタンスが作成され(同じトピック)、別のインスタンスが作成されるまでに最大4人のユーザーが追加されます。最初のルームインスタンスのユーザーが離れると、そのスロットは開いているため、トピックに参加する9番目のユーザーが最初のルームインスタンスに送信されます。

これを管理するための最良の方法は何ですか?私には2つのアイデアがあります:

  1. 「トピック」テーブル:id、label
  2. 「部屋」テーブル:id、topicId
  3. 「人口」テーブル:roomId、userId

ユーザーがトピックを選択/参加すると、次のようになりSELECT COUNT(userId) FROM Population WHERE topicId = <id>ます。カウントが4より大きい場合は、新しいルームを作成し、それを挿入して、挿入IDを返します。ユーザーが部屋を離れると、Populationのその行は削除されます。

または...

  1. 「トピック」テーブル:id、label
  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に設定されます。

TYIA。

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 に答える