任何人对如何实现既使用localStorage的和REST远程存储数据持久层的任何意见或引用:
某一客户端的数据存储在与localStorage的(使用余烬数据索引资料适配器)。 本地存储的数据(使用余烬数据RESTadapter)与远程服务器同步。
服务器从客户端收集的所有数据。 使用数学组符号:
Server = Client1 ∪ Client2 ∪ ... ∪ ClientN
其中,在一般情况下,任何记录可能不是唯一到一定的客户:
ClientX ∩ ClientY ≠ 0, ∀ X,Y ∈ [1,N]
这里是一些假设:
你会使用2个店(一个用于本地存储,一个REST),并同步在它们之间,或使用混合索引资料/ REST适配器和适配器中编写的同步码?
你能看到的任何方式,以避免实施推(网络插座,...)?
你带了的问题不能用三言两语来回答,或者干脆回答。 不过,这里是我的尝试...
首先,有与你采取的做法困难号码:
- 客户端必须始终网络连接到创建的数据以及从服务器接收钥匙。
- 如果你做出不同的商店(localStorage的和REST),所有的应用程序代码需要数据必须看在两家超市。 这显著增加了应用程序的每一个部分的复杂性。
- 创建一行后,如果您要创建子行,你必须等待服务器返回的主键,然后才能引用它的子行的外键。 对于任何中等复杂的数据结构,这将成为一个沉重的负担。
- 当服务器出现故障,所有客户端无法创建数据。
这里是我的方法。 它采用SequelSphereDB ,但大多数的概念可以在其他客户端的数据管理系统中重复使用。
第一:使用的UUID的主键。
大多数客户数据管理系统应该生成通用唯一ID提供的方式。 SequelSphere做它用简单的SQL函数:UUID()。 有一个UUID作为每一行的主键允许在任何时间任何客户端上生成的主键,而无需联系服务器,仍然保证ID将是唯一的。 这也因此使得应用能够在“离线”模式下工作,不需要在运行时服务器的连接。 这也使从把所有的客户端下关闭服务器。
第二:使用单组镜像服务器的表。
这更多的是为了简单起见,比什么都重要的要求。 这也是接下来的两个基本原则的要求。
第三:对于小数据集的向下的同步,从服务器完全清爽客户机数据是优选的。
只要有可能,从服务器的客户端上执行数据的完全刷新。 这是一个简单的管理模式,并在更短的内部数据完整性问题的结果。 的主要缺点是在传送数据大小。
第四:对于大型数据集的向下的同步,执行“交易”更新
这是我的做法变得有点复杂。 如果数据集太大,并且只需要改变行可以同步,你必须找到一种方法根据“交易”同步他们。 那就是:在它们被在服务器上执行,以执行在客户端上提供相同的简单脚本的顺序插入/更新/删除。
优选的是让服务器记录到可以同步下来到设备上的交易上的表。 如果这是不可能的,那么该命令往往可以在服务器上使用的行时间戳,以及具有客户端请求,因为一个特定的时间戳的所有更改记录。 大利空:您将需要保持由删除的行任一音轨“逻辑”中删除,或者在自己的表中跟踪它们。 即便如此,隔离复杂的服务器最好在所有客户端传播它。
第五:对于向上的同步,用“交易”的更新
这是SequelSphereDB真正的亮点:它会让你所有的插入,更新的跟踪和删除对表执行,然后提供他们回到你的同步时间。 它甚至做它跨浏览器重新启动,因为它坚持的localStorage / IndexedDB的信息。 它甚至处理提交和回滚适当。 该客户端应用程序可以使用数据,因为它通常会进行交互,而无需给予思考记录的更改,然后使用SequelSphereDB的“更改跟踪器”重播在同步时间的变化。
如果你不使用 SequelSphere(你应该),然后保持一个单独的表在客户端上记录所有的插入,更新和删除客户端执行。 每当客户端应用程序的插入/更新/删除行,做出一个副本,在“交易”表。 在向上同步时间,把那些。 在服务器上,简单地执行以相同的顺序进行复制,这是客户端上的数据相同的步骤。
也很重要:始终从服务器完全刷新客户端表之前进行向上同步。 :)
结论
我建议在尽可能多的地方尽量在复杂性去为简单。 使用UUID主键是这个非常有帮助。 使用某种“变化跟踪”的也是非常有用的。 使用工具如SequelSphereDB跟踪变化对你来说是最有帮助的,但没有必要为这种方法。
全面披露:我是密切相关的公司SequelSphere,但该产品真的是没有必要的实施上面方法。
文章来源: Architecture for data layer that uses both localStorage and a REST remote server