Database design 脱机模式下的NoSQL数据库和前向兼容性

Database design 脱机模式下的NoSQL数据库和前向兼容性,database-design,nosql,couchdb,database-schema,database-replication,Database Design,Nosql,Couchdb,Database Schema,Database Replication,在做了一些研究之后,似乎当人们询问CouchDB中的模式迁移时,他们很快被反驳说这个概念与NoSQL思想不完全兼容。我理解NoSQL是如何意味着无模式的,它感觉有违直觉。然而,我所处的情况是,我不知道如何完全避免模式迁移。我在移动设备上使用NoSQL。以下是我的主要设置和我的需求 每个移动设备都有自己的复制数据库 移动设备可以脱机工作 移动设备与云服务器上的数据库进行复制以共享其数据 数据在可能的情况下进行复制,以便不同设备上的多个用户可以处理相同的数据 较新版本的客户端可能会决定更改它为特定键

在做了一些研究之后,似乎当人们询问CouchDB中的模式迁移时,他们很快被反驳说这个概念与NoSQL思想不完全兼容。我理解NoSQL是如何意味着无模式的,它感觉有违直觉。然而,我所处的情况是,我不知道如何完全避免模式迁移。我在移动设备上使用NoSQL。以下是我的主要设置和我的需求

  • 每个移动设备都有自己的复制数据库
  • 移动设备可以脱机工作
  • 移动设备与云服务器上的数据库进行复制以共享其数据
  • 数据在可能的情况下进行复制,以便不同设备上的多个用户可以处理相同的数据
  • 较新版本的客户端可能会决定更改它为特定键存储的值类型(即相当于模式更改)
  • 用户可能不会在更新可用时立即更新应用程序
  • 未更新的用户应该仍然能够处理与更新的用户相同的数据
  • 编辑:

  • 应用程序是100%本机代码
  • 我这里的问题是,客户机是旧版本软件的用户不会期望新数据是字符串而不是int本身。因此,不能总是在客户端处理it,因为我们不想强迫用户更新他们的应用程序

    从另一个角度来解释,我希望两个具有两个不同客户端版本的用户能够共享和修改相同的数据,这意味着我需要具有向后和向前兼容性。通常会解决向后兼容性问题,但向前兼容性问题更大。我需要一种方法来继续使用我上次修改的启发式解决冲突,同时有一个版本不能完全解释新模式

    经过一些思考,我可以考虑将云数据库分成多个来源的方法;一个是每个移动设备推送其修改,一对一数据库是移动设备推送适合其版本的最新数据。介于两者之间,我应该处理模式迁移的向后和向前兼容性

    即使在这样的设置中,有没有办法避免模式迁移? 有人看到其他更简单或更安全的解决方案吗? 这种制度有什么局限性? 我觉得我在这方面并不是完全正确的

    谢谢,
    Paul

    如果CouchApps是您的一个选项,那么您实际上可以绕过不同客户端版本的问题。以防你不熟悉这些:couchapp是基于HTML+CSS+JavaScript的应用程序,直接由CouchDB提供服务。在移动平台上,将它们嵌入Cordova(Phonegap)以访问本机功能可能会很方便

    由于couchapp基本上存储在CouchDB数据库中的设计文档中,因此可以像复制普通文档一样复制它们。这使您可以选择在客户机连接到服务器时执行客户机软件的更新(实际上,任何复制都会自动进行)


    如果您想考虑一下这个选项,您可能需要看一看,并且。

    我要提醒您不要过多地评估关于模式迁移和NoSQL数据库的反驳。“他们”可能会说不存在模式,但如果有任何设计文档,甚至代码期望结构以某种方式存在,对我来说,这就是一个模式(有无文档记录)。无论形式模式如何,更改结构都是一个真正的问题。如果较旧的客户端可以访问/管理/保存较新的数据结构,您似乎面临一个挑战。如果给定文档已升级到新版本,则强制用户更新可能是最安全/最可靠的。谢谢您的回答。强制用户更新是一种可能的解决方案,但它确实对我不想要的用户施加了约束。到目前为止,我正在努力寻找一种对用户体验影响最小的解决方案。很抱歉,我忘了提到我的应用程序是100%原生的。我认为在这种情况下,这不是一个可行的选择。即使是,我还是不知道你在想什么。每次旧版本通过pull接收到新数据时,CouchApps会负责执行前向兼容性操作吗?谢谢你的回答!很遗憾,你没有选择。但我要澄清的是:“前向兼容性操作”将是用一个新的设计文档简单地替换过时的设计文档。如果有更新版本的设计文档可用,则在与服务器的任何复制上都会自动发生这种情况。其核心思想是通过复制以相同的方式处理应用程序代码和数据。