現在使用しているアプリケーションにメッセージングシステムを実装しようとしています。メッセージはテーブルに保存されます。
CREATE TABLE `message` (
`MessageID` BIGINT(20) NOT NULL AUTO_INCREMENT,
`Thread` BIGINT(20) NOT NULL,
`From` BIGINT(20) NOT NULL,
`To` BIGINT(20) NOT NULL,
`DateTime` DATETIME NOT NULL DEFAULT '2012-01-01 00:00:00',
`Content` TEXT NOT NULL,
PRIMARY KEY (`MessageID`),
CONSTRAINT `FK_messageTo` FOREIGN KEY (`To`) REFERENCES `team` (`TeamID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_messageFrom` FOREIGN KEY (`From`) REFERENCES `team` (`TeamID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_thread` FOREIGN KEY (`Thread`) REFERENCES `thread` (`ThreadID`) ON DELETE CASCADE ON UPDATE CASCADE
);
スレッドは、会話スレッド、基本的にはユーザーのペアを格納する別のテーブルです。
ユーザーが誰かとの会話を表示するときは、最新のメッセージ、たとえば10件のメッセージのみを表示する必要があります。より多くのメッセージがオンデマンドで表示されます(ボタンのクリックなど)。この場合、データベースをプールする最も効率的な方法がわかりません。
毎回糸全体を取り出して切り落とすと、明らかにポイントが崩れます。
次の行に沿ってクエリを実行します。
SELECT * FROM message WHERE (to = {party1} AND `from` = {party2}) OR (to = {party2} AND `from` = {party1}) ORDER BY messageID DESC LIMIT {start}, {length}
ここで、{name}のような式は変数です。ここでLIMITがどのように機能するか、最初の方法よりも高速になるかどうかはわかりません。
- 3番目のオプションは、スレッド内でインクリメントされる別のフィールド(インデックス)を追加することです(メッセージテーブルの主キーは、システムのどこかに新しいメッセージが追加されるたびにインクリメントされるため)。