我正在构建一个可在多台笔记本电脑上运行的桌面应用程序。每当用户回到办公室并再次访问时,它将需要同步到中央数据库。
我要解决的最大问题是如何设计数据库,以便与中央数据库服务器轻松同步。其中一个主要障碍是尝试确定如何处理密钥,以便它们不会在将要使用的多个笔记本电脑数据库中重复。
例如,假设笔记本电脑1进入名为“客户A”的新客户 - 使用唯一ID,可能会为其分配客户ID 20.笔记本电脑2输入“客户C” - 它也可以分配ID为20对那个客户。当需要同步时,客户A& C将以具有重复ID的服务器结束。
有没有人使用类似这个有优雅解决方案的应用程序?
答案 0 :(得分:2)
替代方案是:
答案 1 :(得分:1)
使用Guids(又名uniqueidentifier
)作为主键,所有复制问题都将消失。使用Guids的惩罚几乎总是被自动增加int
PK的支持者夸大其词。他们需要的额外大小(16个字节对int
的4个字节)是如此微不足道,以至于我对这个主题的讨论感到惊讶。 JOIN
PK上Guid
的查询运行速度比JOIN
int
PK Guid
上的查询慢,但速度不是数量级(即10倍)。您的结果可能会有所不同,但我发现Guid.NewGuid()
JOIN查询的执行时间延长了大约40%(在您记住摩尔定律之前,这似乎是一个很大的惩罚)。
在插入相关数据时,使用Guids for PK也可以让你摆脱困境。在插入父行之前,不必插入子记录然后检索刚刚插入的行的ID,而只需使用int
创建客户端的所有ID。
我之前使用过复制系统,使用{{1}} PK分配范围来解决这个问题,但我永远不会曾再次这样做。
答案 2 :(得分:0)
我不知道对于这个非常不优雅的问题,这是一个“优雅”的解决方案。 Remus有很好的想法,也建议你做一些关于复制的阅读。
你还可以更好地设计一个重复数据删除流程,因为在任何情况下,代表A都会在客户A中上升,而代表b也会在客户A中投放,因为它们来自不同来源,具有不同的主键,他们会有不同的记录。