- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自CouchDB guide :
Maintaining consistency within a single database node is relatively easy for most databases. The real problems start to surface when you try to maintain consistency between multiple database servers. If a client makes a write operation on server A, how do we make sure that this is consistent with server B, or C, or D? For relational databases, this is a very complex problem with entire books devoted to its solution. You could use multi-master, master/slave, partitioning, sharding, write-through caches, and all sorts of other complex techniques.
为什么关系模型中数据库服务器之间很难保持一致性?为什么 CouchDB 方法更简单、更容易?
最佳答案
Couch 通过两种方式简化了它。
首先,它具有内置并由系统强制执行的更高级别的复制模型。
其次,它的数据元素更粗糙,使得乐观锁定和冲突解决模型的工作量更少。
作为一般规则,RDBMS 本身并不支持乐观锁定。许多构建在它们之上的框架都这样做,但 DBMS 本身却不然。有些人可能会在内部支持它,但如果他们这样做,它不会暴露给最终用户。
Couch 本质上支持乐观锁定/版本控制,并依赖于此进行复制。
在 RDBMS 中,大多数较大的订单数据项都被分解为其规范化的关系组件。一个简单的订单很可能由六个表组成,每个表都有自己的行结构。但表及其关系的组合构成了“订单”。鉴于订单的这种更细粒度的表示,数据库很难捕获更高级别的“更改”概念。 “订单已更改”是什么意思?数据库看到的是节点和关系的集合,而不是像“订单”这样的高阶元对象。
应用程序可以定义更改,但数据库则不然。
现在,如果您要复制整个数据库,这并不是什么大问题,但如果您要复制数据库的一部分,则问题会严重得多。
例如,在 Couch 中,订单就是整个文档。更改文档,整个订单就会“更改”,从而复制整个订单。在 RDBMS 中,如果行项目发生变化,那么很容易检测到一行发生了变化,但这是否意味着“顺序”发生了变化?如果订单所指的项目发生变化,订单会发生变化吗?您可以看到这如何变得更加复杂。
所有这些都可以构建在 RDBMS 之上,但是由应用程序(而不是数据库)进行更改管理和促进复制。
但是,无论 CouchDB 提供什么支持,它也只能到此为止,并且在引用中强调了这一警告:
When two versions of a document conflict during replication, the winning version is saved as the most recent version in the document’s history. Instead of throwing the losing version away, as you might expect, CouchDB saves this as a previous version in the document’s history, so that you can access it if you need to. This happens automatically and consistently, so both databases will make exactly the same choice.
It is up to you to handle conflicts in a way that makes sense for your application. You can leave the chosen document versions in place, revert to the older version, or try to merge the two versions and save the result.
在复制过程中,Couch 仅具有确定性规则来使两个系统保持一致。但一致并不意味着它们就是正确的。当 Couch 检测到两份存在冲突的文档时,它会确定性地选择一份,然后胜者将败者踩在脚下。但就你的申请而言,失败者可能是“正确的”,或者正确的文件是两个文件的融合。
您必须编写处理这些合并的逻辑。这是所有主主复制方案的一个基本问题。确定“谁赢”的技术。当对数据应该是什么样子的不同意见到达同一个十字路口时,“现在做什么”问题就出现了。
没有系统可以为您处理这个问题。系统所能做的就是选择它遵循的一组规则,或者让您进行配置来处理问题,因为问题几乎总是依赖于应用程序。
如果 Couch 支持并为您设计的更简单的模型有效,那就太好了。如果没有,那么你就陷入困境了。许多 RDBMS 都对主从复制有坚实的支持,因为它是一个更简单的模型,并且有了这种支持,它对最终用户应用程序来说几乎是透明的。
关于mysql - CouchDB 与关系数据库的分布式一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21366004/
我正在设计一个用于任务管理的移动应用程序(待办事项列表以及许多额外的好东西),可以离线使用并在重新连接时同步。 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
我是一名优秀的程序员,十分优秀!