在异步环境中管理ID

时间:2015-07-31 15:18:23

标签: database identity data-synchronization

如果可以在任意数量的位置(即不同的移动设备)创建新记录,您如何保证记录唯一身份?

(在我的SQL-steeped worldview中,ID的默认类型是int或long,但我很乐意考虑其他可能性。)

我考虑的解决方案是

  1. 为每个设备分配一堆ID(希望)比他们在同步之间使用的ID更多,并在同步时补充它。

  2. 为每个新创建的记录分配一个临时ID(Guid),直到系统可以为记录系统分配一个“真实”ID。

  3. 将Guids用作ID。

  4. 阻止创建过程,直到记录系统提供ID(由于可能的网络中断而不是首选)。

  5. 使用主要值(例如姓名)作为ID(由于可能会更改主要值,因此也不首选)。

  6. 这些是我自己提出来的,但由于这种问题当然已经解决了一千万次,所接受的解决方案是什么?

1 个答案:

答案 0 :(得分:1)

每个设备都可以有一个唯一的ID(可以在初始在线注册期间设置),每个设备都可以自己编号。记录本身将使用复合主键:(originDeviceId,recordId),然后保证在所有设备上都是唯一的,并具有其他一些优点,例如在与服务器同步时无需更改密钥以及使用该密钥构建的能力离线远程设备从一开始就关系。

主要缺点是您需要两列来引用记录。有点hacky - 解决方法是将那些列定义为int而另一个 - 计算的 - 作为一个大的int,由前两个列组成。缺点是大多数RDBMS中没有leftshift运算符,但可以使用乘以2的幂来解决。然后,您只需使用该计算字段建立关系,例如:

SELECT file.* FROM t_File as file
JOIN t_User as user on file.UserId = user.Id

-- t_File.UserId is big int and t_User.Id is deviceId * POWER(2, 32) + recordId

另一个缺点是将你的记录限制为max int,在你的情况下可能会或可能不够,但至少你保证了唯一性。

我看到的最后一个缺点是需要为初始注册分配一个唯一的设备ID。