【问题标题】:How to setup CouchDB attachments storing as files instead of mapped inside the database如何设置 CouchDB 附件存储为文件而不是映射到数据库中
【发布时间】:2020-07-24 15:47:53
【问题描述】:

我找到了 CouchDB 3.1.0 数据库存储在 MAC 上的位置,但没有找到作为文件的附加文档。 /Users/jacobdiego/Library/Application Support/CouchDB2/var/lib/couchdb

因为我刚开始知道这件事,它希望在上面找到文件,比如 jsons 文档,它毕竟是一个 json 文档数据库,但我发现 .couch 文件存储数据库,打开它文本编辑器它混合了二进制数据和附加的 jsons 内容。好像后端不是true-json。

我创建了一个测试数据库,加载了一些 jsons,并附加,检查数据库大小,然后附加一个 46.9Mb 文件(couchdb 安装程序本身)并查看数据库大小增长到 47Mb .

这对于我的应用程序来说是不希望的,因为附件可以是直接从 HTML 输出链接的引用、图像、手册等。

有没有办法告诉 CouchDB 将附件作为单独的文件而不是在 database.couch 文件中处理?

  • 我不需要存储二进制文件的多个修订版

  • 我认为它根本不会被压缩到 database.couch 文件中,它就在那里

  • 我认为 CouchDB 也不能在附件中搜索,我也不需要它。

  • 我认为 CouchDB 永远不会检测到重复的附件

  • 我确实需要通过 HTTP 服务并复制到节点

  • 我确实想在上传文件后重命名文件

  • 我确实想避免重复文件

  • 我确实想避免使用第 3 层,例如带有 php 的 apache http 服务器,因为我的目标是尽可能简单地实现 2 层应用程序

我在网上搜了一下,发现很多很多老旧的cmets的文章,不知道现在的版本是不是不可能。

【问题讨论】:

  • 更新:我意识到 Fauxton 和离线文档已经是 2 层应用程序,包含多个不是附件的文件。它的 http 位置在 /_utils/ 中,在 mac 上映射为 /share/www/... 在应用程序文件中。这个文件夹可能不会被复制,我还不知道。并且也可能在本地主机之外不可用,但可能有办法解决所有这些问题。

标签: database couchdb attachment


【解决方案1】:

正如您所发现的,CouchDB 使用 json,但不会将单个 json 文档作为文件存储在文件系统中。这有很好的理由,但这并不意味着 CouchDB 不再是一个 json 文档存储。 CouchDB 使用自己聪明的类似 b 树的文件格式,而不必依赖文件系统,因为它的 map-reduce 索引效率非常低。

正如您还发现的那样 - 在 CouchDB 中存储二进制 blob 存在成本和权衡,如果您主要(或主要)将其用作块存储,则您并没有充分利用它.偶尔的小附件也很好。

一个好的模式是将附件存储在其他地方,并且只在 CouchDB 中存储元数据。对此没有内置支持,但原理很简单:当您的客户端代码创建带有附件的文档时,它首先将附件存储在任何有意义的地方(文件系统上的文件, S3 存储桶或您选择的块存储),一旦此操作完成,将引用(文件路径或 S3 密钥,或...)存储在文档 json 中。

在获取此文档时,客户端然后读取附件引用并从块存储中获取附件。

额外的客户端工作,是的,显然您仍然需要访问块存储。

在 Cloudant,我们在各种博客 posts 中探索了这方面的元素。实际使用的技术不会直接适用于您,但您可能会发现讨论很有帮助。

【讨论】:

  • 感谢您的回答,我现在知道减少到单个 .couch 文件是由于 b-tree 实现...我同意我可能需要了解有关 b-tree 的更多信息了解为什么将文件存储在其中,而不仅仅是存储对文件的引用。但是,您关于分离附件的建议不符合我对 CouchDB 的期望,即将 LAMP 模型更改为 2 层应用程序。
猜你喜欢
  • 2012-02-08
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2011-02-19
相关资源
最近更新 更多