【发布时间】:2012-12-20 12:39:59
【问题描述】:
我的应用需要与其他应用用户同步(在自己的设备上)。我还想支持离线编辑,当用户连接到互联网时,它会同步到其他协作用户。
因此,用户 A 更改(当他离线时)一些数据(换句话说,他会更新数据库条目)或向数据库添加新记录。当用户 A 连接到 Internet 时,所有更改和新记录都会传递给其他协作用户。因此用户 B 将获得更改/更新,并可以将它们插入/更新到用户 B 的本地设备数据库中。
但我需要确保数据库条目的 ID 在整个系统中是唯一的。因此我需要使用 UUID 之类的东西。
我的问题:在 android sqlite 数据库表中使用 UUID (String / Varchar) 作为主键而不是自动递增的整数是不是一个坏主意?
我猜使用字符串(UUID 有 36 个字符)作为主键会出现性能问题。
我猜索引 uuids 而不是整数需要更长的时间(比较字符串与比较整数)。我还猜想,当我使用 UUID 时,每次插入新的数据库记录/条目时,数据库都需要重新索引主键列,因为它们的主键索引不再按排序顺序(这将是我使用整数自增主键,因为以后的每条记录都加在最后,因为新的自增主键始终是目前为止最大的数,所以索引会自动排序)。我还需要做的是加入 2 - 3 张桌子。我还猜想在 JOINS 上比较字符串而不是整数会减慢数据库查询速度。
但是我看不出有任何其他可能实现这样的协作同步系统,所以我必须使用 UUID,对吧?
另一种可能性是使用整数自增主键并使用第二列 uuid。因此,要在用户本地设备上工作,我会将此主键(整数)用于 JOINS 等,而我会使用 uuid 列与其他用户同步。
你们如何看待这种方法,或者在您看来它是否需要大量工作,因为您不会期望直接使用 UUID 作为主键会出现重大的性能问题?
还有其他建议吗?
【问题讨论】:
-
这是一篇旧帖子,但我想我会分享一个我已经实施的方法。我为设备应用程序实例生成一个 UUID 并将其存储在共享首选项中。我在 Room 表(Int 或 Long)中使用了一个简单的自动生成键。在向服务器发送数据时的 API 中,我在标头中包含应用程序实例 UUID。在此模型中,服务器可以区分和处理服务器表键的分配,该键会同步回设备。出于跨平台的原因,我选择了 UUID 而不是 FID。显然有很多方法可以给猫剥皮。
标签: android performance sqlite primary-key uuid