【问题标题】:Cloudant/Couchdb ArchitectureCloudant/Couchdb 架构
【发布时间】:2017-03-10 10:00:56
【问题描述】:

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

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

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

我的客户端应用程序在登录时向 cloudant 查询用户文档,并且每个组文档都使用该用户的链接文档的视图排序规则。

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

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

我的可扩展性问题是否合理?或者这对于cloudant来说是正常的吗?

【问题讨论】:

    标签: couchdb pouchdb cloudant


    【解决方案1】:

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

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

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

    这是“可扩展的”,因为如果 Cloudant 从主索引或辅助索引检索数据是有效的,因为索引保存在 b 树中,因此具有相邻键的数据彼此相邻存储。 limit 参数可用于对更大的数据集进行分页。

    【讨论】:

    • 嗨,Glynn,添加了我的回复作为更好格式的答案...请看一下,我仍然担心架构是否是最佳方法。
    【解决方案2】:

    是的,这些文件或多或少是您指定的。 链接文件如下:

    {
      "_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,第一个让我获取登录用户文档,第二个让我获取登录用户的所有组文档(使用开始和结束键),第三个让我我得到一个组的所有其他用户文档(再次使用开始和结束键)。

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

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

    对不起,我没看懂这句话?

    谢谢。

    【讨论】:

      【解决方案3】:

      第 1 部分。 我建议在这里去掉“链接”类型——它对 SQL 世界有好处,但对 CouchDb 则不然。

      与此不同,最好利用文档存储的好处,即将用户组存储在“用户”的属性“组”中;和“组”的属性“用户”。

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

      我想注意,我做了一个假设,一个用户的组数和组数是合理的(最多数百个)并且不会经常变化。

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

      1) 组仅包含用户的 ID - 不需要视图。

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

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

      当用户打开一个组时,值(例如联系人的姓名和照片都是从这个本地“字典”中获取的)。 这种方法可以节省一些流量。

      请告诉我你的想法。因为现在我正在设计我的解决方案的架构。谢谢!)

      【讨论】:

      • 第 1 部分显然不是 noSql dbs 的推荐方法。我选择了基于Handling Relational Data with Cloudant 的链接架构。当每个用户都可以访问我的用户列表时,我可以预见到一些严峻的挑战。
      • 无论如何,经过 3 个月的编码和更多限制的学习,我终于搬到了 Firebase。祝您的解决方案好运。
      猜你喜欢
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多