我正在尝试构建一个(简单的)twitter-clone,它使用CouchDB作为Database-Backend。 由于功能集减少,我几乎完成了编码,但是有一件事我无法用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的用户的推文列表,......按时间顺序排序”?我的申请需要另一个架构吗?
答案 0 :(得分:0)
这是仅限CouchDB的应用程序吗?或者你是否在其间使用了一些额外的商业逻辑。在后一种情况下,您可以通过运行多个查询来实现此目的。
这可能包括合并不同的视图。另一种方法是为每条推文添加“私人读者”列表。它允许用户特定(部分)视图,但也引入了为每个新推文添加阅读器列表的复杂性,甚至在新关注者或取消关注操作的情况下更新列表。
考虑可能的操作及其频率非常重要。因此,当您主要生成推文列表时,最好将复杂性转换为如何将读者信息集成到文档中(即将读者集成到您的推文文档中),然后轻松构建有效的视图索引。
如果您对数据进行了很多更改,最好将数据库设计为不要同时更新太多现有文档。相反,尝试通过添加新文档并通过复杂视图进行聚合来添加数据。
但是你已经展示了一个边缘情况,其中简单的(1维)基于列表的索引是不够的。您实际上需要二次索引来按时间和用户ID进行过滤(假设您还需要部分范围)。但这在CouchDB中是不可能的,因此您需要通过将“查询”数据转移到您的文档中并在构建视图时使用它们来解决。
答案 1 :(得分:0)
执行此操作的最佳方法是将created_at
保存为时间戳,然后创建一个视图,并将所有推文映射到user_id
:
function(doc){
if(doc.type == 'tweet'){
emit(doc.user_id, doc);
}
}
然后使用用户ID作为键查询视图,并在应用程序中按需要对它们进行排序(大多数都有数组的排序方法)。
最后一次编辑 - 尝试在couchDB中完成所有操作...请参阅修订版:)