代码之家  ›  专栏  ›  技术社区  ›  Kristof Van Landschoot

在两个CouchDB设计之间迁移

  •  0
  • Kristof Van Landschoot  · 技术社区  · 12 年前

    使用TouchDB iOS,我们有一个iOS应用程序,它有一个本地CouchDB文档存储,可以复制到云计算的CouchDB服务器。我们有几个用户在运行这个应用程序,结果产生了一堆TouchDB数据库副本。

    当我们开始使用这个应用程序时,我们还是CouchDB的新手(现在仍然是)。我们设计了一个关系,使类型a的文档具有一个属性,即:这是一个描述逗号分隔的id列表的字符串,这些id是类型B的文档。

    因此,以雇员/雇主为例 Employer 拥有一处名为 employeeIds 这将是“1,7,8,10”。如果员工10退出,此列表将更新为“1,7,8”。

    问题是,当在应用程序的另一个实例上,比如在另一部手机上,员工7会退出列表,是否会更新为“1,8,10”,从而在复制时引发冲突。

    所以我们认为一个更好的想法是 employerId 在 Employee 文档属性。如果一个员工辞职,我们就把他的 员工ID 清空。这样的冲突会少很多,对吧?

    我现在面临的问题是,有多个应用程序,我如何将所有CouchDB数据库从第一个设计迁移到第二个设计。

    我需要退役所有旧的应用程序吗?还是有一种防故障的方法可以将所有应用程序迁移到新的设计中,而不会破坏现有的应用程序,同时最大限度地减少冲突?我应该如何最好地处理这个案子?

    1 回复  |  直到 12 年前
        1
  •  0
  •   Stefan Kögl    12 年前

    基本上有两种情况:

    如果你的应用程序只对数据库进行查询(通过视图),你可以简单地更新视图,以同样使用“老式”和“新型”文档。然后,您可以在后台更新您的文档(例如,按照 _changes feed )并最终再次取消对旧式文档的支持。

    如果你的应用程序使用应用程序的结构,那么可能也无法更新应用程序。否则,您需要在新旧样式的文档之间设置一些代理,例如

    CouchDB with new-style docs  <-- proxy application --> apps with old-style docs
    

    当然,你可以更新你的应用程序来处理旧的和新的文档,这样你就可以逐渐转换你的文档。

    如果您必须重新设计对CouchDB的访问权限,您可以考虑 update handlers 以使未来的变化更加透明。