【问题标题】:noSQL implementation: threaded messaging systemnoSQL 实现:线程消息系统
【发布时间】:2010-12-03 06:19:32
【问题描述】:

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

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

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

谁有这样的经验请给我一个提示。

更新:我的客户端应用程序是用 PHP 编写的,并且可能会保持不变。

【问题讨论】:

  • -1 您接受的答案没有回答您的问题。我来到这里期待 noSQL 中的解决方案,但没有找到。这个问题对 SO 或社区没有帮助。

标签: nosql messaging


【解决方案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 或文档数据库执行此操作的优势在于,您只需使用一个查询就可以为“对话”拉回所有数据,因为它们都存储在一起。不利的一面是,为了方便一次读取所有数据,您牺牲了一些临时查询的灵活性。

【讨论】:

    【解决方案2】:

    如果使用线程而不是评论作为主要实体呢?让我们首先尝试使用 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 数据库中效果很好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 2015-04-25
      • 2011-09-26
      • 2010-11-13
      相关资源
      最近更新 更多