【问题标题】:Building a (simple) twitter-clone with CouchDB使用 CouchDB 构建(简单)twitter 克隆
【发布时间】:2011-10-17 13:52:23
【问题描述】:

我正在尝试构建一个(简单的)twitter-clone,它使用 CouchDB 作为数据库后端。 由于它减少了功能集,我几乎完成了编码,但还有一件事我无法用 CouchDB 解决 - 每个用户的时间线。

与 twitter 一样,每个用户的时间线应该按时间顺序显示我关注的所有人的推文。使用 SQL,这是一个非常简单的 Select-Statement,但我不知道如何使用 CouchDBs Map/Reduce 重现它。

这是我将与 RDBMS 一起使用的 SQL 语句:

SELECT * FROM tweets WHERE user_id IN [1,5,20,33,...] ORDER BY created_at DESC;

CouchDB 架构详细信息

用户模式:

{
  _id:xxxxxxx,
  _rev:yyyyyy,
  "type":"user",
  "user_id":1,
  "username":"john",
  ...
}

推文模式:

{
"_id":"xxxx",
"_rev":"yyyy",
"type":"tweet",
"text":"Sample Text",
"user_id":1,
...
"created_at":"2011-10-17 10:21:36 +000"
}

使用view collations,查询 CouchDB 以获取“所有 user_id = 1 按时间顺序排列的推文”列表非常简单。

但是如何检索“所有属于 ID 为 1、2、3、...的用户的推文,按时间顺序排列”的列表?我的应用程序是否需要其他架构?

【问题讨论】:

    标签: join twitter couchdb clone timeline


    【解决方案1】:

    最好的方法是created_at保存为时间戳,然后创建一个视图,并将所有推文映射到user_id

    function(doc){
      if(doc.type == 'tweet'){
        emit(doc.user_id, doc);
      }
    }
    

    然后以用户 ID 作为键查询视图,并在您的应用程序中对它们进行排序(大多数都有数组的排序方法)。

    最后一次编辑 - 试图在 couchDB 中完成所有内容...查看修订:)

    【讨论】:

    • 对不起,这是不好的做法。您不会在 reduce 函数中简化为小而简单的值——这不是 reduce 函数应该使用的方式。
    • 这里,去掉reduce函数,改变map函数。 @PartlyCloudy 我不应该使用这样的 reduce,现在开心吗?
    • 9999999999 是一个比所有时间戳都大的任意大数字。
    • 这会返回 user_id 从 1 到 9999999999 的所有推文,但是如果我想检索 user_id = [1,2,6,33,87] 的推文怎么办?
    • 你又是对的,我又修好了……第三次魅力?
    【解决方案2】:

    这是一个仅限 CouchDB 的应用程序吗?或者你是否在两者之间使用了一些额外的商业逻辑。在后一种情况下,您可以通过运行多个查询来实现这一点。

    这可能包括合并不同的视图。另一种方法是为每条推文添加一个“私人读者”列表。它允许用户特定(部分)视图,但也引入了为每条新推文添加读者列表的复杂性,甚至在出现新关注者或取消关注操作时更新列表。

    考虑可能的操作及其频率很重要。因此,当您主要生成推文列表时,最好将复杂性转移到如何将读者信息集成到文档中(即将读者集成到推文文档中),然后轻松构建有效的视图索引。

    如果您对数据有很多更改,最好将数据库设计为不要同时更新太多现有文档。相反,尝试通过添加新文档来添加数据并通过复杂视图进行聚合。

    但是您已经展示了一个边缘情况,即简单的(一维)基于列表的索引是不够的。您实际上需要二级索引来按时间和用户 ID 进行过滤(鉴于您还需要两者的部分范围)。但这在 CouchDB 中是不可能的,因此您需要通过将“查询”数据转移到您的文档中并在构建视图时使用它们来解决问题。

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多