Android 使用SQLite和Azure SQL数据库作为中心存储的在线/离线多客户端移动应用程序的最佳主键策略是什么?
在以下情况下,关系数据库模型最适合使用什么主键策略Android 使用SQLite和Azure SQL数据库作为中心存储的在线/离线多客户端移动应用程序的最佳主键策略是什么?,android,ios,sqlite,database-design,azure,Android,Ios,Sqlite,Database Design,Azure,在以下情况下,关系数据库模型最适合使用什么主键策略 数以万计的用户 每个用户有多个客户端(电话、平板电脑、台式机) 每个表有数百万行(不断增长) Azure SQL将是通过Web API公开的中央数据存储。客户端将包括一个web应用程序和许多本机应用程序,包括iOS、Android、Mac、Windows 8等。web应用程序将需要一个“始终打开”的连接,并且不会有本地数据存储,而是通过api检索和更新-通过RESTful api思考CRUD 所有其他客户端(电话、平板电脑、桌面)都将有一个
- 数以万计的用户
- 每个用户有多个客户端(电话、平板电脑、台式机)
- 每个表有数百万行(不断增长)
我们是不是忽略了什么?还有其他值得研究的方法吗?讨论每种方法的优缺点都会很有帮助。要记住的关键(双关语)是为存储在持久存储上的每个对象都有一个唯一的键。如何处理该对象的存储完全取决于您以及如何访问该密钥的方法。您列出的每种策略都有自己的原因来解释为什么要这样做,但最终它们会在数据库中存储某个对象的键,以便在数据库中保留相同的对象引用的同时更改其所有属性 我仔细考虑了这个问题,最终决定GUID通常是最好的解决方案。以下是一些关于原因的信息: 身份 Identity选项听起来似乎消除了所有的负面影响,但在实现了实现该系统的单页Web应用程序之后,我可以告诉您,它为代码增加了大量的复杂性。一个临时id可以很快地在客户端数据中传播,在寻找每一个可能的用法时,很难创建一个没有漏洞的系统。它通常会产生特定于应用程序和数据的硬编码信息来跟踪客户机上的外键(随着数据库的更改和您忘记更新这些信息,这既繁琐又容易出错)。它还为每次同步增加了大量开销,因为每次同步都可能需要运行多个表来检查临时ID。也许有更好的方法来实现这个系统,但我还没有看到一个好的方法,它不会在数据中增加大量的复杂性和可能的错误状态 混合成的 复合方法在生成会话ID和从中创建ID的过程中也给代码增加了很多复杂性,它们与GUI相比没有任何优势,只能保证它是唯一的-但问题是,GUID在理论上是唯一的,尽管我担心可能会重复,我意识到这是一个无限小的机会,实际上有一个非常简单的方法来处理这种可能性,它不是唯一的 伪装 关于使用GUID,我最担心的是