2

私が構築している Web サイト内でユーザーの会話のための db スキーマを構築する方法について考えてきました。

「会話」とは、昔ながらのプライベート メッセージング システムに似たシステムを意味しますが、Facebook のオフライン チャットに似ています。

これまでのところ、私はこれを持っています:

id
from_id
to_id
content
created_on

それは機能しますが、各会話の最後に交換されたメッセージをすべてリストに入れる方法を見つけることができませんdb schemaでした。

users主要な数値 ID を持つテーブルがあると仮定すると、db schemaユーザーの会話を処理するには何が最適でしょうか?

乾杯!

4

2 に答える 2

0

私はそれを次のようにします:

ここに画像の説明を入力

  • Table User には、ユーザー ID + あなたが持っているその他の情報があります。
  • ユーザーがユーザーと話すのを格納するリレーショナル テーブルですが、これは 1 人のユーザーとの 1 つのチャットです。N 人のユーザーが M 人のユーザーと同時に話したい場合は、別の設計にする必要があります。

メッセージの送信者、送信者、メッセージの内容、時刻、ステータス (既読、削除、未読、非表示など) を保存できるので、これで問題ないと思います。

それを行う方法は複数あると確信しています。

于 2012-06-22T19:47:47.493 に答える
0

from_id と to_id は必要ないと思います。from_id だけが必要です。日付によって、会話の最初と最後のメッセージを決定します。

ただし、単純さとパフォーマンスのために、ユーザー中心のジャンクション テーブルを作成します。

user_id  with_user_id conversation_id  last_read_id
-------  ------------ ---------------  --------------
1        2            1                1
1        3            2                0
2        1            1                2
3        1            2                1

次に、会話について:

id  conversation_id  from_id  content  created_on
--  ---------------  -------  -------  ----------
1   1                1        hello    2012-06-01 12:00:00 
2   1                2        hi       2012-06-01 12:10:01
3   2                3        howdy    2012-06-01 12:40:10

したがって、誰かが会話を開始したい場合は、ジャンクション テーブルをチェックして、その人と既に会話中であるかどうかを確認します。ある場合は、再開してください。

新しい会話の場合は、各ユーザーのジャンクション テーブルにレコードを追加してください。ジャンクション テーブルの last_read_id 列は、会話テーブルの id を参照します。

ユーザー 1 のすべての未読メッセージを取得するには:

SELECT c.* FROM junction j
JOIN conversation c
ON c.conversation_id = j.conversation_id
AND c.id > j.last_read_id
WHERE j.user_id = 1
ORDER BY c.created_on DESC

結果:

id  conversation_id  from_id  content  created_on
--  ---------------  -------  -------  ----------
3   2                3        howdy    2012-06-01 12:40:10
2   1                2        hi       2012-06-01 12:10:01

ユーザー 1 とユーザー 2 の間のすべてのメッセージを取得するには (ユーザー 1 の観点から):

SELECT c.* FROM junction j
JOIN conversation c
ON c.conversation_id = j.conversation_id
WHERE j.user_id = 1 AND j.with_user_id = 2
ORDER BY c.created_on DESC

結果:

id  conversation_id  from_id  content  created_on
--  ---------------  -------  -------  ----------
2   1                2        hi       2012-06-01 12:10:01
1   1                1        hello    2012-06-01 12:00:00 
于 2012-06-25T12:45:50.910 に答える