我可以为每个数据库创建多个集合吗?

Can I create multiple collections per database?

从 mongo 切换到 pouchdb(使用 Cloudant),我喜欢 "one database per user" 概念,但是有没有办法为每个数据库创建多个 collections/tables?

示例

- Peter  
        - History
        - Settings
        - Friends
- John
        - History
        - Settings
        - Friends

等...

Couchdb 没有集合的概念。但是,您可以在文档中结合使用类型标识符和 Couchdb 视图来获得类似的结果。

类型标识符

当您在 Couchdb 中保存文档时,添加一个指定类型的字段。例如,您可以像这样存储一个朋友:

{
  _id: "XXXX",
  type: "Friend",
  first_name: "John",
  ...
}

你会像这样存储历史:

{
  _id: "XXXX",
  type: "History",
  url: "http://www.google.com",
  ...
}

这两个文档都在同一个数据库中,如果您查询该数据库中的所有文档,那么您会同时收到这两个文档。

观看次数

您可以创建按类型过滤的视图,然后直接查询这些视图。例如,像这样创建一个视图来检索朋友(在 Cloudant 中你可以去添加新的设计文档,你可以直接复制并粘贴它):

{
  "_id" : "_design/friends",
  "views" : {
    "all" : {
      "map" : "function(doc){ if (doc.type && doc.type == 'Friend') { emit(doc._id, doc._rev)}}"
    }
  }
}

我们来扩展地图功能:

function(doc) {
  if (doc.type && doc.type == "Friend") {
    emit(doc._id, doc._rev);
  }
}

本质上,这个映射函数是说只将类型为 == "Friend" 的文档关联到此视图。现在,我们可以查询这个视图,并且只返回朋友:

http://SERVER/DATABASE/_design/friends/_view/all

其中 friends = 设计文档的名称,all = 视图的名称。将 SERVER 替换为您的服务器,将 DATABASE 替换为您的数据库名称。

您可以在此处找到有关视图的更多信息:

https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

您可以在 relational-pouch 中查找类似的内容。否则你可以做“每个用户 3 个数据库”。 ;)

我可能不完全理解您在这里需要什么,但总的来说,您可以通过 CouchDB/Cloudant/PouchDB 中的 3 种不同方式实现您描述的内容。

  1. 每人一份文件(彼得、约翰)。当然 - 如果集合不是很大,更重要的是如果它们不是由不同的用户同时更新(或者更糟的是在不同的数据库实例中)导致冲突,那么在 JSON 中每个集合只有一个元素,包含一个数组和你可以只用一个文件来操纵一切。让访问变得轻而易举。
  2. 每个集合一个文档(Peter History、Peter Settings 等)。类似的约束,但您可以创建一个文档来保存这些集合中的每一个。如果它们不会经常同时修改,那么您将拥有一个 Peter's History 文档和另一个 Peter's Settings 文档。
  3. 每个项目一个文档。这是最好的粒度方法——许多小的简单文档,每个文档包含一个元素(比如 Peter 的单个历史条目)。代码变得稍微简单一些,因为删除项目变成了删除,许多客户端可以同时更新项目,但现在您依赖视图将所有项目放入列表中。例如,带有键 [person, listName, item] 的视图可以让您访问您想要的内容。

通常,您的数据模式决策归结为并发性。您提到了 PouchDB,所以您可能有一个单线程客户端,而选项 1 既好又简单?