Cloudant/Couchdb体系结构
我正在构建一个使用后端Cloudant数据库的通讯簿应用程序。数据库存储3种类型的文档:Cloudant/Couchdb体系结构,couchdb,pouchdb,cloudant,Couchdb,Pouchdb,Cloudant,我正在构建一个使用后端Cloudant数据库的通讯簿应用程序。数据库存储3种类型的文档: -> User Profile document -> Group document -> User-to-Group Link document 按照文档的名称,我的数据库中有用户,有用户组(如whatsapp),每个用户都有指向组的链接文档(链接文档还存储该组中该用户的设置/权限) 登录时,我的客户端应用程序通过查看该用户链接文档的排序规则,向cloudant查询用户文档和每个组文档
-> User Profile document
-> Group document
-> User-to-Group Link document
按照文档的名称,我的数据库中有用户,有用户组(如whatsapp),每个用户都有指向组的链接文档(链接文档还存储该组中该用户的设置/权限)
登录时,我的客户端应用程序通过查看该用户链接文档的排序规则,向cloudant查询用户文档和每个组文档
然后使用我上面识别的组,我找到该组的所有其他用户
现在的挑战是,我需要监视组和用户文档上的任何更改。我在应用程序端使用PockDB,可以根据所有组和用户文档的ID调用“更改”API。但规模可能是每组500个用户,一个登录用户是10-50个组的一部分。用户数量增加到1000将成为后端支持的噩梦
我的可伸缩性问题是否值得考虑?或者这对于cloudant来说是正常的吗?如果我正确理解了您的模式,您可以使用以下形式的文档:
{
_id: "user:glynn",
type: "user",
name: "Glynn Bird"
}
{
_id: "group:Developers",
type: "group",
name: "Software Developers"
}
{
_id: "user:glynn:developers"
}
在上面的示例中,主键的排序允许通过使用数据库的\u all\u docs
端点的startkey
和endkey
参数检索用户及其所有成员身份
这是“可伸缩的”,因为if对于Cloudant从主索引或辅助索引检索数据是有效的,因为索引保存在b树中,所以具有相邻键的数据彼此相邻存储。
limit
参数可用于对较大的数据集进行分页。如果我正确理解您的模式,您可以使用以下形式的文档:
{
_id: "user:glynn",
type: "user",
name: "Glynn Bird"
}
{
_id: "group:Developers",
type: "group",
name: "Software Developers"
}
{
_id: "user:glynn:developers"
}
在上面的示例中,主键的排序允许通过使用数据库的\u all\u docs
端点的startkey
和endkey
参数检索用户及其所有成员身份
这是“可伸缩的”,因为if对于Cloudant从主索引或辅助索引检索数据是有效的,因为索引保存在b树中,所以具有相邻键的数据彼此相邻存储。
limit
参数可用于对较大的数据集进行分页。是的,文档或多或少都是您指定的。
链接文件如下:
{
"_id": <AutoGeneratedID>,
"type": "link",
"user": user_id,
"group": group_id
}
使用上述3个索引和include docs=true,第一个让我获取登录用户文档,第二个让我获取登录用户的所有组文档(使用开始键和结束键),第三个让我获取组的所有其他用户文档(再次使用开始键和结束键)
获取文档已经完成,但现在我需要监控每个组的用户的更改,为此,我不需要使用用户ID数组查询更改API吗?还有别的办法吗
Cloudant从主索引或辅助索引检索数据,因为
索引保存在b-树中,因此具有相邻键的数据存储在b-树的旁边
彼此
对不起,我不明白这句话
谢谢。是的,这些文档或多或少都是您指定的。 链接文件如下:
{
"_id": <AutoGeneratedID>,
"type": "link",
"user": user_id,
"group": group_id
}
使用上述3个索引和include docs=true,第一个让我获取登录用户文档,第二个让我获取登录用户的所有组文档(使用开始键和结束键),第三个让我获取组的所有其他用户文档(再次使用开始键和结束键)
获取文档已经完成,但现在我需要监控每个组的用户的更改,为此,我不需要使用用户ID数组查询更改API吗?还有别的办法吗
Cloudant从主索引或辅助索引检索数据,因为
索引保存在b-树中,因此具有相邻键的数据存储在b-树的旁边
彼此
对不起,我不明白这句话
谢谢。第一部分。
我建议在这里去掉“link”类型——这对SQL世界有好处,但对CouchDb没有好处
相反,最好利用文档存储的优点,即将用户组存储在“用户”的属性“组”中;属性“用户”表示“组”
使用此方法,您可以将筛选复制设置为仅处理特定组的更改,并且这些更改将已经包含该组的所有用户
我想注意,我做了一个假设,一个用户的组数和组数是合理的(最多几百个),并且不会经常改变
第2部分。
您可以将ID存储在这些属性中,然后使用视图“连接”其他数据。或者我也在考虑其他方法(对于我的用例,但您的方法类似):
1) 组仅包含用户ID-不需要视图
2) 您创建每个用户联系人的视图,即为每个用户获取与他有共同组的所有用户
3) 将此视图复制到客户端应用程序
当用户打开一个组时,值(例如联系人的姓名和图片)取自此本地“字典”)。
这种方法可以节省一些流量
请告诉我你的想法。因为现在我正在设计解决方案的体系结构。谢谢 第一部分。
我建议在这里去掉“link”类型——这对SQL世界有好处,但对CouchDb没有好处
相反,最好利用文档存储的优点,即将用户组存储在“用户”的属性“组”中;属性“用户”表示“组”
使用此方法,您可以将筛选复制设置为仅处理特定组的更改,并且这些更改将已经包含该组的所有用户
我想注意,我做了一个假设,一个用户的组数和组数是合理的(最多几百个),并且不会经常改变
第2部分。
您只需将ID存储在这些属性和