noSQL实现:线程消息系统

时间:2010-12-03 06:19:32

标签: nosql messaging

我正在尝试为我的网站构建一个线程消息传递系统。基本上,该系统提供以下功能:

  • 允许用户在彼此之间发送消息
  • 任意级别的回复(主题)

我已经尝试过使用mysql + php并构建了一个骨架。但是在整个线程检索部分是有点递归的,我认为这不是关系模式可以做的最好的事情。所以现在我正在研究非SQL实现。希望避免这样的问题,使数据检索更自然。

任何人都有这样的经历请给我一个提示。

更新:我的客户端应用程序是用PHP编写的,可能仍然如此。

2 个答案:

答案 0 :(得分:1)

文档数据库或对象数据库将很好地完成您正在寻找的内容。有一些方法你也可以使用一个同样可以工作的RDBMS。示例模式是:

CREATE TABLE messages (
  message_id INT,
  original_message_id INT,
  parent_message_id INT,
  message VARCHAR(4000)
);

然后,您可以从此表中执行选择,如

SELECT *
FROM messages
WHERE message_id = ? OR original_message_id = ?
ORDER BY parent_message_id;

这可能会解决您的问题。使用OODB或文档数据库执行此操作的优点是,您只需使用一个查询就能够为“对话”提取所有数据,因为它们全部存储在一起。在缺点方面,您牺牲了一些临时查询灵活性,以便于一次读取所有数据。

答案 1 :(得分:0)

使用线程而不是注释作为主要实体怎么样?让我们首先尝试SQL和两个人的线程:当第一个用户将第一个消息发送给第二个用户时,您创建一个新线程,并将该线程与两个用户链接(用户有许多线程)。消息本身可以将其存储为JSON。然后,每个响应将在相同的JSON(相同的varchar或类似字段)中。如果您不需要搜索(或列出)单个消息,此解决方案很有效。

示例:

Users:
Id-Name
1-User1
2-User2

UsersByThread:
UId-TId
1-1
2-1

Threads
Id-JSON
1-'{"messages":[{"user":"User1","text":"blablabla"}]}'

然后,当第二个用户响应时,您可以简单地使用json,并添加一条新消息:

Threads
Id-JSON
1-'{"messages":[{"user":"User1","text":"blablabla"},{"user":"User2","text":"blablabla"}]}'

如果第三个人加入该主题,您只需在UsersByThread中添加该关系,并在JSON中添加该消息。

顺便说一句,你可以在像沙发这样的nosql商店中使用相同的想法,甚至可以在像redis这样的键值存储中使用相同的想法。你也可以在neo4j中创建一个更自然的系统,但我认为这可以在常规的sql数据库中运行得很好