我的应用需要与其他应用用户同步(在自己的设备上)。我还想支持离线编辑,当用户连接到互联网时,它会同步到其他协作用户。
因此,用户 A 更改(当他离线时)一些数据(换句话说,他会更新数据库条目)或将新记录添加到数据库中。当用户 A 连接到 Internet 时,所有更改和新记录都会传递给其他协作用户。因此,用户 B 将获得更改/更新,并可以将它们插入/更新到用户 B 的本地设备数据库中。
但我需要确保数据库条目的 id 在整个系统中是唯一的。因此我需要使用 UUID 之类的东西。
我的问题:在 android sqlite 数据库表中使用 UUID (String / Varchar) 作为主键而不是自动递增的整数是不是一个坏主意?
我猜使用字符串(UUID 有 36 个字符)作为主键会出现性能问题。
我猜索引 uuids 而不是整数需要更长的时间(比较字符串与比较整数)。我还猜想,当我使用 UUID 时,每次插入新的数据库记录/条目时,数据库都需要重新索引主键列,因为它们的主键索引不再按排序顺序(这将是我使用整数自增主键,因为以后的每条记录都加在最后,因为新的自增主键始终是目前为止最大的数,所以索引会自动排序)。我还需要做的是加入 2-3 张桌子。我还猜想在 JOINS 上比较字符串而不是整数会减慢数据库查询的速度。
但是我看不到实现这种协作同步系统的任何其他可能性,所以我必须使用 UUID,对吗?
另一种可能性是使用整数自增主键并使用第二列 uuid。因此,要在用户本地设备上工作,我会将此主键(整数)用于 JOINS 等,而我会使用 uuid 列与其他用户同步。
你们如何看待这种方法,或者您认为它是否需要做很多工作,因为您不会期望直接使用 UUID 作为主键会出现重大的性能问题?
还有其他建议吗?