给每个 CouchDB 用户一个单独的数据库是好的做法吗?
Is it good practice to give each CouchDB user a separate database?
关于用户及其文档的结构,我有一些概念性的问题。
在 CouchDB 中为每个用户提供他们自己的数据库来保存他们的文档是一个好习惯吗?
我了解到 couchDB 可以处理数千个数据库,而且每个用户都拥有自己的数据库并不少见。
原因:
问这个问题的原因是我想创建一个登录用户只能查看自己的文档而不能查看任何其他用户文档的系统。
任何建议。
提前致谢。
这是一个很常见的用例,尤其是在移动环境中,每个用户的数据都使用 Android、iOS 或 JavaScript 之一同步到设备(pouchdb) 库。
所以在概念上,这很好,但我仍然建议在投入生产之前彻底测试。
请注意,多个数据库的缺点之一是您无法编写跨多个数据库的查询。不过有一些解决方法 - 有关详细信息,请参阅 。
2017 年 3 月 17 日更新:
请查看 Cloudant Envoy 以获取有关此方法的更多信息。
Database-per-user is a common pattern with CouchDB when there is a requirement for each application user to have their own set of documents which can be synced (e.g. to a mobile device or browser). On the surface, this is a good solution - Cloudant handles a large number of databases within a single installation very well. However ...
为每个用户创建 CouchDB 存储桶 (DB) 是相当常见的情况。虽然有一些缺点:
- 您必须在每个用户存储桶中保持 ddoc 同步,因此跨多个存储桶部署 ddoc 更改可能会成为真正的冒险。
- 如果文档以某种方式在用户之间共享,您会在每个存储桶中获得文档和视图索引副本。
- 您必须阻止
_info
个请求以避免用户列表泄漏(或者您必须使用哈希命名存储桶)。
- 无论如何,您需要在 Couch 前面使用一些代理来创建和准备用户注册的新存储桶。
- 你最好保护 Couch 在收到许多请求时不会 运行 容量不足 – 它也需要代理。
可以使用 _list
函数实现每个文档读取 ACL,但这种方法有一些缺点,它还需要一个代理,至少是一个在 CouchDB 前面的 Web 服务器。有关详细信息,请参阅 CouchDb read authentication using lists。
您也可以尝试使用 CoverCouch,它实现了完整的每个文档读取 ACL,保持原始 CouchDB API 不变,但它处于早期测试阶段。
解决方案与 Web 应用程序一样古老 - 如果您想到 mySQL 数据库,数据库中没有任何内容可以阻止用户 B 查看属于用户 A 的记录 - 它全部编码在应用程序层.
在 CouchDB 中同样没有完全安全的方法来防止用户 B 访问用户 A 编写的文档。您需要像以前一样在您的应用程序层中编写代码。
只要您在 CouchDB 和用户之间有一个 Web 应用程序,您就没有问题。当您允许 CouchDB 直接处理请求时就会出现问题。
为多个用户使用多个数据库有一些重要的缺点:
- 无法使用本机 couchdb API 查询不同数据库中的数据。 分析你的网站整体状况是不可能的!
- 维护很快就会变得很辛苦: 想想每次要执行备份replicating/compacting 数千个数据库
这取决于您的用例,但我认为一个不错的方法可以是:
只允许通过虚拟主机访问。这可以使用代理来实现,或者更简单地通过使用 couchdb hosting 提供程序来实现,它可以让您微调 "domains->path" 映射
使用design docs / couchapps,而不是直接文档CRUD API, 对于 read/write 操作
2.1。使用 _rewrite 处理程序只允许有效请求:通过这种方式,您可以立即阻止对 _all_docs、_all_dbs 和其他
等合理处理程序的访问
2.2。使用 _list 和 _view 处理程序 read doc/role 基于 ACL,如 [=11] 中所述=]
2.3。使用 _update 处理程序 write doc/role 基于 ACL
2.4。对基于 read/write 角色的 ACL.
使用经过身份验证的重写规则
2.3。 filtered _changes handler 是另一种使用基于 read doc/role 的 ACL 检索所有用户数据的方法。根据您的使用情况,此 可以有效地尽可能简化您的阅读 API,让您专注于您的更新 API.
关于用户及其文档的结构,我有一些概念性的问题。
在 CouchDB 中为每个用户提供他们自己的数据库来保存他们的文档是一个好习惯吗?
我了解到 couchDB 可以处理数千个数据库,而且每个用户都拥有自己的数据库并不少见。
原因:
问这个问题的原因是我想创建一个登录用户只能查看自己的文档而不能查看任何其他用户文档的系统。
任何建议。
提前致谢。
这是一个很常见的用例,尤其是在移动环境中,每个用户的数据都使用 Android、iOS 或 JavaScript 之一同步到设备(pouchdb) 库。
所以在概念上,这很好,但我仍然建议在投入生产之前彻底测试。
请注意,多个数据库的缺点之一是您无法编写跨多个数据库的查询。不过有一些解决方法 - 有关详细信息,请参阅
2017 年 3 月 17 日更新:
请查看 Cloudant Envoy 以获取有关此方法的更多信息。
Database-per-user is a common pattern with CouchDB when there is a requirement for each application user to have their own set of documents which can be synced (e.g. to a mobile device or browser). On the surface, this is a good solution - Cloudant handles a large number of databases within a single installation very well. However ...
为每个用户创建 CouchDB 存储桶 (DB) 是相当常见的情况。虽然有一些缺点:
- 您必须在每个用户存储桶中保持 ddoc 同步,因此跨多个存储桶部署 ddoc 更改可能会成为真正的冒险。
- 如果文档以某种方式在用户之间共享,您会在每个存储桶中获得文档和视图索引副本。
- 您必须阻止
_info
个请求以避免用户列表泄漏(或者您必须使用哈希命名存储桶)。 - 无论如何,您需要在 Couch 前面使用一些代理来创建和准备用户注册的新存储桶。
- 你最好保护 Couch 在收到许多请求时不会 运行 容量不足 – 它也需要代理。
可以使用 _list
函数实现每个文档读取 ACL,但这种方法有一些缺点,它还需要一个代理,至少是一个在 CouchDB 前面的 Web 服务器。有关详细信息,请参阅 CouchDb read authentication using lists。
您也可以尝试使用 CoverCouch,它实现了完整的每个文档读取 ACL,保持原始 CouchDB API 不变,但它处于早期测试阶段。
解决方案与 Web 应用程序一样古老 - 如果您想到 mySQL 数据库,数据库中没有任何内容可以阻止用户 B 查看属于用户 A 的记录 - 它全部编码在应用程序层.
在 CouchDB 中同样没有完全安全的方法来防止用户 B 访问用户 A 编写的文档。您需要像以前一样在您的应用程序层中编写代码。
只要您在 CouchDB 和用户之间有一个 Web 应用程序,您就没有问题。当您允许 CouchDB 直接处理请求时就会出现问题。
为多个用户使用多个数据库有一些重要的缺点:
- 无法使用本机 couchdb API 查询不同数据库中的数据。 分析你的网站整体状况是不可能的!
- 维护很快就会变得很辛苦: 想想每次要执行备份replicating/compacting 数千个数据库
这取决于您的用例,但我认为一个不错的方法可以是:
只允许通过虚拟主机访问。这可以使用代理来实现,或者更简单地通过使用 couchdb hosting 提供程序来实现,它可以让您微调 "domains->path" 映射
使用design docs / couchapps,而不是直接文档CRUD API, 对于 read/write 操作
2.1。使用 _rewrite 处理程序只允许有效请求:通过这种方式,您可以立即阻止对 _all_docs、_all_dbs 和其他
等合理处理程序的访问2.2。使用 _list 和 _view 处理程序 read doc/role 基于 ACL,如 [=11] 中所述=]
2.3。使用 _update 处理程序 write doc/role 基于 ACL
2.4。对基于 read/write 角色的 ACL.
使用经过身份验证的重写规则2.3。 filtered _changes handler 是另一种使用基于 read doc/role 的 ACL 检索所有用户数据的方法。根据您的使用情况,此 可以有效地尽可能简化您的阅读 API,让您专注于您的更新 API.