0

メッセージング アプリケーション用に次のテーブルがあります。

`messaging_message`
 - thread_id
 - content
 - timestamp
 - sender_id 

`messaging_messagestatus`
 - thread_id # though redundant here, makes messaging queries much easier
 - message
 - recipient_id
 - status

いくつかのメモ:

  • 各メッセージには、それを参照する 2 つの messagestatus エントリがあり、メッセージ スレッド内の各ユーザーに 1 つずつあります。
  • 1 つのメッセージ スレッドに複数のメッセージが存在する場合があります。
  • ユーザーはメッセージを削除できます (status='deleted')。1 人のユーザーがメッセージを削除しても、スレッド内の他のユーザーの同じメッセージは明らかに削除されません。

SQL の初歩的な知識で最善を尽くして、取得するクエリを作成しました。

ユーザーを指定して、1) thread_id を示す、削除されていない個別のスレッドをすべて取得します。2) message_id // 3) タイムスタンプ // 4) そのスレッドの最新のメッセージの内容。5) メッセージ スレッド内の相手が誰であるか。6) ユーザーが最新のメッセージを送信したかどうか。これが私がこれまでに持っているものです:

SELECT thread_id, message_id, timestamp, content,
(SELECT DISTINCT recipient_id FROM messaging_messagestatus ms WHERE ms.thread_id=thread_id     
  AND recipient_id !=4) as other_recipient,
(CASE WHEN sender_id=4 THEN True ELSE False END) as sent_last_message

FROM
( SELECT m.thread_id, recipient_id, timestamp, m.id as message_id, content, sender_id
    FROM messaging_messagestatus ms
    INNER JOIN messaging_message m
    ON ms.message_id = m.id
WHERE recipient_id = 4 AND m.thread_id NOT in 
    ( SELECT thread_id FROM messaging_messagestatus WHERE status='deleted' 
      AND recipient_id = 4)

ORDER BY timestamp DESC) combined GROUP BY thread_id

このクエリは機能し、次のような結果が得られます。

thread_id   message_id  timestamp       content         other_recipient   sent_last_message
2           3       2012-06-09 13:02:08 newest message  80                 1

約 20k メッセージ行 / 35k ステータス行で、最初のクエリは約 14 秒かかります! 3s に関する後続のクエリ。

4

1 に答える 1

0

これらのテーブルをマージする必要があります。このような直接関連するデータを持つ2つの別個のテーブルを持つことは、適切なプログラミングではありません。これにより、これら2つのデータソース間の結合がなくなり、データのクエリがより簡単かつ迅速になります。

于 2012-06-09T20:59:46.133 に答える