- 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/
我正在寻找可以从 Eclipse 的 UML 图生成代码的工具。该工具应该从 UML 图生成代码,进行逆向工程以查看代码更改,并提供合并选项以防止因任何更改而删除文件。 是否有工具可以做到这一点,或者
我正在寻找有关建模的见解。我有一个关于设计模式和基本类图、序列图和用例的介绍类(class)。 我发现类图作为我编程中的组织工具非常宝贵。到目前为止,用例还算有用。 本学期我正在上课,更深入地学习 U
如何使用 flutter 数据建模技术访问“HH”和“mm”。我一直在尝试按以下方式使用它,但是下面给出了错误。 我的数据模型当前为它的简化版本。 class Week { final Strin
我正在使用 Neo4j 和 PHP。在我的项目中,我有餐厅节点。每个节点都有纬度、经度和分类属性。 我需要返回与用户给定分类相匹配的餐厅节点,其结果按距用户位置的距离排序(即第一个最近的餐厅)。 最简
我希望 POJO 包含一个 Status 字段(只有两个可能的值 SUCCESS、FAILED),并且根据此状态,第二个字段需要为 POJO 对象(如果 Status 为 SUCCESS) 或只是字符
我正在尝试将我的办公室迁移到数据库应用程序中。这是我得到的: (来源:phunkei.de) 公司和个人从客户继承(1:1关系)。这是因为他们都可以是“客户”并收到账单,我想引用订单中的单个表。公司和
我目前有这个数据库结构: 一个条目可以有多个"file"、“文本”和“url”类型的项目。 这些项目中的每一项在文本、网址或文件表(存储数据的位置)中都有一个对应的项目。 我需要一个查询来有效地选择一
下面的代码不应该像“if(condition)”语句一样工作吗,当它在另一个循环中并且“body”有自己的 break 或 continue 语句时,会出现明显的错误行为: for( ; condit
我一直在像这样存储和递增下载计数器: INCRBY downloads: 1 但现在我想要下载:* 按值排序,以便显示热门下载列表。 我觉得我可以更好地存储它。我愚弄了: ZINCRBY downlo
我开始使用图形数据库,在我的团队中,我们已经开始为我们的软件建模图形。当我们尝试“记录”模型以查看数据库的结构时,问题就出现了。对于 SQL 数据库,您只需查看 SQL 模式。 我们花了一些时间阅读
我正在做一个固定效应回归并且遇到了自相关问题,为了解决这个问题,我正在使用预测、lmtest 和 plm 包进行 ARIMA 建模。我的数据是一般面板数据,looks like this ,我正在尝试
我想知道是否有任何工具可以帮助我对 C 应用程序(即函数式编程)进行建模。例如。我目前正在构建一个共享库。但是为了直观地传达我的设计,我需要类似 UML 的东西。我想这样做,以便审查我的设计的人不需要
我正在尝试将 JSON 转换为 GSON ,但我无法建模。谁能给我举个例子。 [ { "id": "1", "name": "lalala",
正如标题所说,在 中建模 optional 参数的最佳方法是什么?斯卡拉 ? 对于 optional 参数,我的意思是执行函数体不需要的值。 要么因为该参数存在默认值,要么根本不需要该参数本身(例如配
我发现 UML 可用于记录 OO 系统的各个方面,尤其是用于整体架构的类图和用于说明特定例程的序列图。我想为我的 clojure 应用程序做同样的事情。我目前对模型驱动开发不感兴趣,只是在交流应用程序
我想知道是否有人知道如何使用 UML 在属性中建模 DateTime 基元类型? 最佳答案 我想这取决于日期的格式......请参阅下面的示例,其中我使用两个整数(分别为日和年)和一个名为“Month
我有一些与我的问题建模相关的问题。我正在研究基于模型的测试的论文项目。还想从专家的角度了解我是否采用正确的方法来建模我的场景。我正在对 Android 应用程序的 UI 进行建模,遍历它们,生成测试用
我正在尝试建立对 CouchDB 以及如何为某些现实世界场景建模数据的理解。我现在已经尽可能多地“按日期获取我的博客文章”;) 给定这样的文件: { "_id": "couch1",
一个模型资源是如何分层的?例如假设一个人有一个“留言板”并且“消息”是一种资源。假设“消息”可以有回复,从而形成一个讨论线程。如何模拟线程的概念? “消息”是否包含它的子项? “线程”是它自己的资源吗
我正在尝试创建一个像通用 POJO 一样工作的对象,因为我必须通过不同的对象传递它,并且我需要一个接口(interface)来访问其属性。 目前,我使用具有 getField 方法的基础对象来完成此操
我是一名优秀的程序员,十分优秀!