Cloudant / Couchdb架构

时间:2017-01-04 11:46:27

标签: couchdb pouchdb cloudant

我正在构建一个使用后端Cloudant数据库的地址簿应用程序。该数据库存储3种类型的文档:

-> User Profile document
-> Group document
-> User-to-Group Link document

随着文档名称的转移,我的数据库中有用户,有用户组(如whatsapp),每个用户都有一个组的链接文档(链接文档还存储了该组的设置/权限)该组中的用户)。

登录时我的客户端应用程序,用户文档查询cloudant,以及使用该用户的链接文档上的视图排序规则查看每个组文档。

然后使用我上面确定的组,找到该组的所有其他用户。

现在,挑战在于我需要监控组和用户文档的任何更改。我在应用程序端使用pouchdb,并可以针对所有组和用户文档的ID调用“更改”API。但是,每个组的规模可能是500个用户,并且登录用户是10-50个组的一部分。乘以1000的用户将成为后端支持的噩梦。

我的可扩展性问题是否值得关注?或者对于云量来说这是正常的吗?

3 个答案:

答案 0 :(得分:0)

如果我正确理解您的架构,您可以使用以下格式的文档:

{
   _id: "user:glynn",
   type: "user",
   name: "Glynn Bird"
}
{  
   _id: "group:Developers",
   type: "group",
   name: "Software Developers"
} 
{    
   _id: "user:glynn:developers"
 }

在上面的示例中,主键的排序允许使用startkeyendkey参数检索用户及其所有成员资格数据库{{{{{ 1}}端点。

这是"可扩展的"从某种意义上说,如果Cloudant从主索引或二级索引中检索数据是有效的,因为索引保存在b树中,因此具有相邻键的数据彼此相邻存储。可以使用_all_docs参数对较大的数据集进行分页。

答案 1 :(得分:0)

是的,文件或多或少都是你指定的。 链接文件如下:

{
  "_id": <AutoGeneratedID>,
  "type": "link",
  "user": user_id,
  "group": group_id
}

我编写了以下视图映射函数:

if(type == "link") {
    emit(doc.user, {"_id": doc.user});
    emit([doc.user, doc.group], {"_id": doc.group});
    emit([doc.group, doc.user], {"_id": doc.user});
}

使用上面的3个索引和include-docs = true,1st让我获取登录的用户文档,2nd让我获取登录用户的所有组文档(使用开始和结束键),第3个让我我获取一个组的所有其他用户文档(再次使用开始和结束键)。

获取文档已完成,但现在我需要监视每个组用户的更改,为此,我不需要使用用户ID数组查询更改API吗?还有其他办法吗?

  

Cloudant从主索引或辅助索引检索数据,因为   index保存在b树中,因此具有相邻键的数据存储在旁边   彼此

对不起,我不明白这个说法?

感谢。

答案 2 :(得分:0)

第1部分。 我建议在这里摆脱“链接”类型 - 这对SQL世界有好处,但不适用于CouchDb。

而不是这样,最好利用文档存储的好处,即将用户组存储在“用户”的属性“组”中;和“集团”的“用户”属性。

使用此方法,您可以设置筛选复制以仅处理特定组的更改,并且这些更改已包含该组的所有用户。

我想要注意的是,我做了一个假设,即用户组数和组数是合理的(最多数百个)并且不会频繁更改。

第2部分。 您可以将ID存储在这些属性中,然后使用Views来“加入”其他数据。或者我也在考虑其他方法(对于我的用例,但你的方法类似):

1)组仅包含用户ID - 无需查看。

2)您创建每个用户联系人的视图,即为每个用户获取与他有共同组的所有用户。

3)将此视图复制到客户端应用程序。

当用户打开一个组时,值(例如联系人的姓名和图片来自本地“词典”)。 这种方法可以节省一些流量。

请让我知道您的想法。因为我现在正在设计我的解决方案的架构。谢谢!)