我正在尝试为我目前正在使用的应用程序实现一个消息传递系统。消息存储在一个表中:
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
);
Thread 是另一个存储对话线程的表,基本上是成对的用户。
当用户查看他们与 somone 的对话时,他们应该只显示最近的消息,例如 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 在这里是如何工作的,是否会比我的第一种方法更快。
- 第三种选择是添加另一个在线程内递增的字段(索引)(因为每当在系统中的任何位置添加新消息时,消息表中的主键都会递增)。