创建数据库项的通常做法是让数据库控制主键(id)的生成。无论您使用自增整数id还是UUID,这通常都是正确的。
我正在构建一个客户端应用程序(Angular,但技术并不重要),希望能够将离线行为集成到其中。为了允许离线对象的创建和关联,我需要客户端应用程序为新对象生成主键。这既是为了允许与离线创建的其他对象进行关联,也是为了保证幂等性(确保由于网络问题而不小心将相同的对象保存两次)。
然而,挑战在于当该对象发送到服务器时会发生什么。您是使用临时的客户端ID,然后用服务器随后生成的ID替换它,还是在客户端和服务器之间使用某种ID翻译层- 这就是Trello在构建其离线功能时所做的。
然而,我想到可能有第三种方法。我在后端为所有表使用UUID。因此,这使我意识到我可以理论上将在前端生成的UUID插入到后端中。 UUID的整个目的是它们是通用唯一标识符,因此前端不需要知道服务器状态来生成一个。如果它们碰撞的可能性很小,则服务器上的唯一性标准会防止重复。
我正在构建一个客户端应用程序(Angular,但技术并不重要),希望能够将离线行为集成到其中。为了允许离线对象的创建和关联,我需要客户端应用程序为新对象生成主键。这既是为了允许与离线创建的其他对象进行关联,也是为了保证幂等性(确保由于网络问题而不小心将相同的对象保存两次)。
然而,挑战在于当该对象发送到服务器时会发生什么。您是使用临时的客户端ID,然后用服务器随后生成的ID替换它,还是在客户端和服务器之间使用某种ID翻译层- 这就是Trello在构建其离线功能时所做的。
然而,我想到可能有第三种方法。我在后端为所有表使用UUID。因此,这使我意识到我可以理论上将在前端生成的UUID插入到后端中。 UUID的整个目的是它们是通用唯一标识符,因此前端不需要知道服务器状态来生成一个。如果它们碰撞的可能性很小,则服务器上的唯一性标准会防止重复。
这是一种合法的方法吗?风险似乎是1.碰撞和2.我没有预料到的任何形式的安全性。 UUID的生成方式似乎已经解决了碰撞问题,但我无法确定允许客户端选择插入对象的ID是否存在风险。