我正在构建一个使用后端Cloudant数据库的地址簿应用程序。该数据库存储3种类型的文档:
-> User Profile document
-> Group document
-> User-to-Group Link document
随着文档名称的转移,我的数据库中有用户,有用户组(如whatsapp),每个用户都有一个组的链接文档(链接文档还存储了该组的设置/权限)该组中的用户)。
登录时我的客户端应用程序,用户文档查询cloudant,以及使用该用户的链接文档上的视图排序规则查看每个组文档。
然后使用我上面确定的组,找到该组的所有其他用户。
现在,挑战在于我需要监控组和用户文档的任何更改。我在应用程序端使用pouchdb,并可以针对所有组和用户文档的ID调用“更改”API。但是,每个组的规模可能是500个用户,并且登录用户是10-50个组的一部分。乘以1000的用户将成为后端支持的噩梦。
我的可扩展性问题是否值得关注?或者对于云量来说这是正常的吗?
答案 0 :(得分:0)
如果我正确理解您的架构,您可以使用以下格式的文档:
{
_id: "user:glynn",
type: "user",
name: "Glynn Bird"
}
{
_id: "group:Developers",
type: "group",
name: "Software Developers"
}
{
_id: "user:glynn:developers"
}
在上面的示例中,主键的排序允许使用startkey
和endkey
参数检索用户及其所有成员资格数据库{{{{{ 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)将此视图复制到客户端应用程序。
当用户打开一个组时,值(例如联系人的姓名和图片来自本地“词典”)。 这种方法可以节省一些流量。
请让我知道您的想法。因为我现在正在设计我的解决方案的架构。谢谢!)