- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个问题,我已经尝试回答一段时间了,但无法弄清楚:
您如何设计或划分 CouchDB 文档?
以博客文章为例。
半“关系”方法是创建一些对象:
这很有道理。但我正在尝试使用 couchdb(出于所有原因,它很棒)来建模相同的事物,但这非常困难。
大多数博客文章都为您提供了如何执行此操作的简单示例。他们基本上以相同的方式划分它,但说你可以向每个文档添加“任意”属性,这绝对是好的。所以你在 CouchDB 中会有这样的东西:
有些人甚至会说你可以把评论和用户放在那里,这样你就会有这样的:
<code>post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}</code>
这看起来非常好并且很容易理解。我还了解如何编写从所有帖子文档中提取评论的 View ,将它们放入评论模型中,与用户和标签相同。
但后来我想,“为什么不把我的整个网站放入一个文档中呢?”:
<code>site {
domain: "www.blog.com"
owner: "me"
pages {
page {
title: "Blog"
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
post {
id: 18091890192984
title: "Second Post"
...
}
}
}
}
}</code>
您可以轻松地创建 View 来找到您想要的内容。
那么我的问题是,如何确定何时将文档分成更小的文档,或者何时在文档之间建立“关系”?
我认为如果像这样划分的话,它会更加“面向对象”,并且更容易映射到值对象:
<code>posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author_id: "Lance1231"
tags: ["sample", "post"]
}
}
authors {
author {
id: "Lance1231"
name: "Lance"
age: "23"
}
}
comments {
comment {
id: "comment1"
body: "Interesting Post"
post_id: 123412804910820
}
comment {
id: "comment2"
body: "I agree"
post_id: 123412804910820
}
}</code>
...但随后它开始看起来更像关系数据库。很多时候,我继承的东西看起来像“文档中的整个站点”,因此用关系对其进行建模更加困难。
我读过很多关于如何/何时使用关系数据库与文档数据库的文章,所以这不是这里的主要问题。我更想知道,在 CouchDB 中建模数据时应用什么好的规则/原则。
另一个例子是 XML 文件/数据。一些 XML 数据的嵌套深度超过 10 层,我希望使用相同的客户端(例如 Ajax on Rails 或 Flex)来可视化,我将从 ActiveRecord、CouchRest 或任何其他对象关系映射器呈现 JSON。有时我会得到包含整个站点结构的巨大 XML 文件,如下所示,我需要将其映射到值对象以在我的 Rails 应用程序中使用,这样我就不必编写另一种序列化/反序列化数据的方法:
<code><pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages></code>
所以一般的 CouchDB 问题是:
非常感谢您的帮助,如何使用 CouchDB 划分数据的问题让我很难说“从现在开始我应该这样做”。我希望尽快到达那里。
我研究了以下网站/项目。
...但他们还没有回答这个问题。
最佳答案
对此已经有一些很好的答案,但我想在选项组合中添加一些更新的 CouchDB 功能,以处理 viatropos 描述的原始情况。
拆分文档的关键点是可能存在冲突的地方(如前所述)。您永远不应该将大量“困惑”的文档保存在一个文档中,因为您将获得完全不相关的更新的单个修订路径(例如,添加注释以添加对整个站点文档的修订)。管理各种较小文档之间的关系或连接一开始可能会令人困惑,但 CouchDB 提供了多种选项来将不同的部分组合成单个响应。
第一个大问题是 View 整理。当您将键/值对发送到 Map/Reduce 查询的结果中时,键将根据 UTF-8 排序规则进行排序(“a”位于“b”之前)。您还可以将 Map/Reduce 中的复杂键输出为 JSON 数组:["a", "b", "c"]
。这样做将允许您包含由数组键构建的排序“树”。使用上面的示例,我们可以输出 post_id,然后输出我们引用的事物的类型,然后输出其 ID(如果需要)。如果我们随后将引用文档的 id 输出到返回值中的对象中,我们可以使用“include_docs”查询参数将这些文档包含在 Map/Reduce 输出中:
{"rows":[
{"key":["123412804910820", "post"], "value":null},
{"key":["123412804910820", "author", "Lance1231"], "value":{"_id":"Lance1231"}},
{"key":["123412804910820", "comment", "comment1"], "value":{"_id":"comment1"}},
{"key":["123412804910820", "comment", "comment2"], "value":{"_id":"comment2"}}
]}
使用“?include_docs=true”请求相同的 View 将添加一个“doc”键,该键将使用“value”对象中引用的“_id”,或者如果“value”对象中不存在该“_id”,它将使用发出该行的文档的“_id”(在本例中为“post”文档)。请注意,这些结果将包含一个“id”字段,该字段引用发出的源文档。为了空间和可读性,我将其保留。
然后,我们可以使用“start_key”和“end_key”参数将结果过滤为单个帖子的数据:
?start_key=["123412804910820"]&end_key=["123412804910820", {}, {}]或者甚至专门提取某种类型的列表:
?start_key=["123412804910820", "comment"]&end_key=["123412804910820", "comment", {}]这些查询参数组合是可能的,因为空对象 (“
{}
”) 始终位于排序规则的底部,而 null 或“”始终位于顶部。
在这些情况下,CouchDB 添加的第二个有用的功能是 _list 函数。这将允许您通过某种模板系统运行上述结果(如果您想要 HTML、XML、CSV 或其他任何形式),或者如果您希望能够请求整个帖子的内容(包括作者和评论数据)通过单个请求并作为与您的客户端/UI 代码所需的内容相匹配的单个 JSON 文档返回。这样做将允许您以这种方式请求帖子的统一输出文档:
/db/_design/app/_list/posts/unified??start_key=["123412804910820"]&end_key=["123412804910820", {}, {}]&include_docs=true您的 _list 函数(在本例中名为“unified”)将获取 View 映射/reduce(在本例中名为“posts”)的结果,并通过 JavaScript 函数运行它们,该函数将以您的内容类型发回 HTTP 响应。需要(JSON、HTML 等)。
将这些内容结合起来,您可以在您认为对更新、冲突和复制有用且“安全”的任何级别拆分文档,然后在需要时根据需要将它们重新组合在一起。
希望有帮助。
关于couchdb - CouchDB 文档建模原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1530745/
我正在设计一个用于任务管理的移动应用程序(待办事项列表以及许多额外的好东西),可以离线使用并在重新连接时同步。 Couch 和 Pouch DB 给我留下了深刻的印象,但我仍然不确定数据库和角色的最佳
CouchDB 中如何实现多范围查询?对于单个范围条件, startkey 和 endkey 组合工作正常,但同样的事情不适用于多范围条件。 我的 View 函数是这样的: "function(doc
是否可以在不同的 CouchDB 数据库之间进行连接?我知道,我可以将所有数据放入同一个数据库中,但我想使用 Ubuntus DesktopCouch,它有一些默认数据库,比如我想使用的联系人和笔记。
给定以下对象结构: { key1: "...", key2: "...", data: "..." } 有没有办法通过查询 key1 和 key2 而不设置两个不同的 View (每
我从 CouchDB 开始,需要一点帮助。 我有很多数据在表中列出给用户。用户应该能够通过多个动态参数过滤该数据。 例如。假设有一个包含日期、作者、标签、is_published、标题字段的表。 用户
刚刚在 mac 山狮上使用 brew 安装了 CouchDb。一切顺利,直到我遇到以下问题启动服务器我不知道 erlnag 并且无法分析转储文件 `couchdb Apache CouchDB 1.2
在使用关系数据库工作了这么长时间后,我真的很努力地理解这个新概念...... 谁能解释我应该如何进行存储,比如类别层次结构? 在关系数据库中,我有: 类别: 类别编号 父类别 ID 姓名 或那种性质的
我希望有人可以在这里验证或更正我的结论。 我正在考虑写一个小的副项目。我想创建一个用于记笔记的桌面应用程序,该应用程序将同步到 Web 服务器,以便多个安装可以保持同步并共享数据,并且如果需要,还可以
我试图在单个 CouchDB 文档中存储多个独立附件,并为每个附件分配任意属性(即描述)。是否有这样做的约定?据我所知,我无法将它们插入 _attachments直接构造。提前致谢! 最佳答案 您不能
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 2年前关闭。 Improve t
这些功能是什么? 我在哪里可以阅读有关它们如何工作的信息? CouchDB 权威指南没有解释它,很奇怪。 最佳答案 来自 CouchDB 权威指南: There are other design do
我一直在阅读 Linked documents在 CouchDb 文档中,它看起来很好。 但是是否可以在数据库 A 中编写一个 View 来从数据库 B 发出文档?我需要它,因为我们在不同的数据库中存
使用 CouchDB 1.0.1。 我删除了一些文件,然后我放了一些其他的文件 _id作为删除的。 现在这些新文档有 _deleted_conflicts field : "_deleted_conf
我想实现一个 webapp - 一个集成来自各种来源的数据并将它们显示给用户的提要。用户应该只能看到他有权阅读的提要项目(例如,因为它们属于他所属的项目)。但是,许多用户可能(并且将会)看到一个提要项
我是 CouchDB 的新手并正在学习它。我没有遇到 CouchDB 对参照完整性的支持。 我们可以为 CouchDB 文档中的字段创建外键吗? 例如是否可以确保供应商数据库中提供订单文档中使用的供应
是否有任何技术/建议来强制执行独特的约束?是的,我们可以创建唯一的 key ,但我们不能更改 key 和 key ,而且这种方法不适合复杂的验证(单独的唯一登录、单独的唯一电子邮件等...) 例如,一
我有一个问题,我已经尝试回答一段时间了,但无法弄清楚: 您如何设计或划分 CouchDB 文档? 以博客文章为例。 半“关系”方法是创建一些对象: 发帖 用户 评论 标签 片段 这很有道理。但我正在尝
CouchDB 可以在同一台机器上处理数千个独立的数据库吗? 假设您有一组 BankTransaction。有数千条记录。 (编辑:实际上并不存储事务——只需考虑大量非常小的、频繁更新的记录。它基本上
我有一个 CouchDB 数据库,主要存储文档附件。 文件存储在数据库中,URL 结构如下:/db-name/numeric-file-id/official-human-readable-file-
我正在阅读 Apress 的《Beginning CouchDB》一书,其中有一行让我有点困惑: Also important to note is that CouchDB will never o
我是一名优秀的程序员,十分优秀!