使用TouchDB-iOS我们有一个iOS应用程序,它有一个本地CouchDB文档存储,可以复制到云端CouchDB服务器。我们有几个用户正在运行这个应用程序,导致一堆TouchDB数据库副本出现在那里。
当我们开始使用该应用程序时,我们是CouchDB的新手(我们仍然是)。我们设计了一个关系,以便类型A的文档具有一个属性:这是一个字符串,描述了以逗号分隔的id类型列表,它们是B类文档。
因此,使用Employee / Employer示例,Employer
有一个名为employeeIds
的属性,即“1,7,8,10”。如果员工10退出此列表,则会更新为“1,7,8”。
问题是,当在另一个应用程序实例上,在另一部手机上,让我们说,员工7会退出列表,如果更新为“1,8,10”,则会在复制时造成冲突。
因此,我们认为更好的想法是在employerId
文档属性中添加Employee
。如果员工退出,我们只需将其employerId
设置为空。这样的冲突会少得多,对吗?
我现在面临的问题是有多个应用程序,如何将所有CouchDB数据库从第一个设计迁移到第二个设计。
我是否需要淘汰所有旧应用程序,或者是否有一种自动防故障方法可以将所有应用程序迁移到新设计而不会破坏现有应用程序并最大限度地减少冲突?我该怎样处理这个案子?
答案 0 :(得分:0)
基本上有两种情况:
如果您的应用仅对数据库进行查询(通过视图),您只需更新视图即可同时使用“旧式”和“新式”文档。然后,您可以在后台更新文档(例如,按照_changes feed),最后再次删除对旧式文档的支持。
如果您的应用使用了应用的结构,那么也可能无法更新应用。否则,你需要在它们之间有一些代理,用于翻译新旧文档,例如
CouchDB with new-style docs <-- proxy application --> apps with old-style docs
您当然可以更新您的应用以处理旧式和新式文档,以便您可以逐步转换文档。
如果您必须重新设计对CouchDB的访问权限,可以考虑update handlers以使将来的更改更加透明。