Validation 在运行的数据库中更改文档验证标准有哪些风险和后果?

Validation 在运行的数据库中更改文档验证标准有哪些风险和后果?,validation,couchdb,replication,Validation,Couchdb,Replication,举一个最简单的例子: 从一个空数据库开始 添加文档 添加带有验证功能的设计文档,该功能拒绝所有内容 复制那个数据库 首先要问一个具体的问题,我希望能通过将我指向正确的url快速给出答案:复制的结果是否由某个规则定义,例如,文档总是按照保存顺序复制,或者,第一个文档的成功复制是否取决于设计文档是否首先到达目的地?在我做的快速实验中,两个文档都得到了成功的验证,但我试图找出结果是在某个地方的规范中定义的,还是依赖于实现的 要问一个后续问题,这个问题比较繁琐,可能没有一个单一的答案,还可能发生什么,出

举一个最简单的例子:

  • 从一个空数据库开始
  • 添加文档
  • 添加带有验证功能的设计文档,该功能拒绝所有内容
  • 复制那个数据库
  • 首先要问一个具体的问题,我希望能通过将我指向正确的url快速给出答案:复制的结果是否由某个规则定义,例如,文档总是按照保存顺序复制,或者,第一个文档的成功复制是否取决于设计文档是否首先到达目的地?在我做的快速实验中,两个文档都得到了成功的验证,但我试图找出结果是在某个地方的规范中定义的,还是依赖于实现的

    要问一个后续问题,这个问题比较繁琐,可能没有一个单一的答案,还可能发生什么,出现了什么样的解决方案来管理这些问题?很明显,不同的服务器同时(我犹豫地使用这个词)具有不同版本的验证函数是可能的。我认为验证器可以向后兼容,每个新版本都会向switch语句添加一个case,该语句会查找文档的say a
    schema\u version
    属性。然后,如果一个版本2文档到达一个服务器,其中版本3验证器是看门人,那么它将被允许进入。如果一个版本3的文档到达版本2的验证器,这就有点棘手了,这可能取决于应用程序的默认设置是严格还是宽松。但这两种情况中的任何一种都可能发生,或者复制规则是否可以确保即使服务器在上下移动,更新和删除也在到处进行,并且复制连接是断断续续和间接的,文档在其适当的验证功能之前永远不会到达给定的服务器,验证功能永远不会太晚到达,无法处理它应该检查的文档之一

    我很可能把这件事搞得太复杂了,或者错过了一些禅宗的见解,但痛苦的经历告诉我,我不够聪明,无法预测并发系统会进入什么样的状态

    编辑:

    正如Marcello在评论中所说,各个服务器上的更新都有序列号,复制按序列号顺序应用更新。我对这件事有一个模糊的想法,但我对细节仍不清楚。我试图找到一个最简单的模型,让我了解在复杂的CouchDB系统中什么可以发生,什么不可以发生

    假设我将服务器A的状态设置为空,并对其进行了三次文档写入。因此,其状态可以表示为以下字符串: A1、A2、A3

    假设服务器B也有三次写入:
    B1、B2、B3

    我们将A复制到B,所以B的状态现在是:
    B1、B2、B3、A1、A2、A3
    。虽然A更新可能在输入B时采用了一个序列号,但现在的状态是:
    B1、B2、B3、B4(A1)、B5(A2)、B6(A3)

    如果我理解正确的话,replicator还记录了一个事实,即A3之前的所有内容都已复制到B,并且它碰巧将此记录存储为B的内部状态的一部分,但我想知道这是否是一个在简单模型中可以忽略的实现细节

    如果您操作这些规则集,A更新和B更新将在复制到的任何服务器上保持有序。也许唯一的方法就是把A复制到B,删除A上的A1和B上的A2,把A复制到C,然后把B复制到C,在C上留下一个状态:
    A2,A3,B1,B2,B3,B4(A1)

    这有什么意义吗?也许字符串不是正确的可视化方式,也许最好想想,我不知道,机场里的一堆队列(服务器),机场工作人员(复制者)按照一定的规则将人们从一个队列移动到另一个队列,让自己陷入试图跳过队列的想法中,(不知何故在当前队列中领先的人之前排队。)。这样做的好处是使模型个性化,但我们可能不想在机场复制人

    或者也许有某种方式可以解释为河内塔楼式的游戏,尽管是FIFO队列而不是后进先出堆栈


    这是我希望找到的一个模型——就行为而言绝对精确,所有不相关的实现细节都被剥离掉,并且使用任何隐喻或意象都可以使直觉变得简单

    基本用例很简单。为数据库更改编制索引并询问需要复制哪些更改。在这个算法中,顺序是隐含的,您担心的事情不应该发生。作为旁注,但这并不会改变订单。

    谢谢Marcello,我认为这也是它的工作方式。不过,我想找一份正式的声明。O'Reilly这本书有点太随便了(毕竟,标题是“魔法”),wiki页面上甚至没有出现“序列”这个词。即使我能流利地阅读Erlang源代码,它也很少有内部注释,并且不区分指定的行为和实现细节。很有可能我正在寻找的东西——像教科书而不是实用的烹饪书——还不存在。