以SQLite和Azure SQL数据库为中心存储的在线/离线多客户端移动应用程序的最佳主要关键策略是什么?

在给定以下关系数据库模型的情况下,最佳的主要关键策略是什么?

  • 数以万计的用户
  • 每个用户多个客户端(手机,平板电脑,桌面)
  • 每桌数百万行(不断增长)

Azure SQL将成为通过Web API公开的中央数据存储。 客户端将包括一个Web应用程序和一些本机应用程序,包括iOS,Android,Mac,Windows 8等。Web应用程序将需要一个“永远在线”的连接,不会有本地数据存储,而是取而代之通过api – 通过RESTful API思考CRUD。

所有其他客户端(手机,平板电脑,桌面)将有一个本地数据库(SQLite)。 在首次使用这种types的客户端时,用户必须进行身份validation和同步。 一旦validation和同步,这些客户端可以在脱机模式下运行(在本地SQLite数据库中创build,删除和更新logging)。 这些更改最终将与Azure后端同步。

数据库的分布式性质给我们留下了一个主要的问题和提出这个问题的原因。

这是我们到目前为止所考虑的:

GUID

每个客户创build它自己的密钥。 在同步时,重复密钥的机会非常小,但是我们需要通过向每个客户端写入function来解释它,以便用新密钥更新所有关系。 GUID很大,当考虑每个表的多个外键时,存储可能随时间而成为问题。 可能最大的问题是GUID的随机性,这意味着它们不能(或不应该)被用作聚簇索引。 这意味着我们需要为每个表创build一个聚集索引(可能是任意的)。

身分

每个客户创build它自己的主键。 在同步时,这些密钥被服务器生成的密钥replace。 这增加了同步过程的额外复杂性,并强制每个客户端“修复”包括相关表上的所有外键的键。

综合

每个客户端在第一次同步时被分配一个客户端ID。 此客户端ID与本地自动递增ID结合使用,作为每个表的复合主键。 这个组合键将是唯一的,所以在同步时不应该有冲突,但是这意味着大多数表将需要一个复合主键。 性能和查询的复杂性是这里关心的问题。

HiLo(合并复合)

与复合方法类似,每个客户端在第一次同步时被分配一个客户端ID(int32)。客户端ID与一个唯一的本地ID(int32)合并到一个列中,以使应用程序范围唯一的ID(int64)。 这应该导致在同步过程中没有冲突。 虽然每个客户端产生的ID是连续的,但是这些密钥和GUID的顺序更多,会有数以千计的唯一的客户端ID,那么我们是否仍然有在我们的聚集索引上存在碎片的风险?

我们在俯视什么? 还有其他的方法值得研究吗? 讨论每种方法的优缺点将是相当有帮助的。

Solutions Collecting From Web of "以SQLite和Azure SQL数据库为中心存储的在线/离线多客户端移动应用程序的最佳主要关键策略是什么?"

要记住的关键(双关意图)是为持久存储上存储的每个对象提供一个唯一的关键字。 你如何处理这个对象的存储完全取决于你,以及如何访问该对象的方法。 你列出的每个策略都有自己的原因,他们为什么要做他们自己的工作,但最后他们正在存储一个特定对象的关键字在数据库中,所以它的所有属性都可以改变,同时在数据库中保留相同的对象引用。