为了简单和(假设)速度,我一直更喜欢在数据库中使用长整数作为主键.但是,当对对象实例使用REST或类似Rails的URL方案时,我最终会得到如下URL:

http://example.com/user/783

然后假设还有ID为782、781、.、2和1的用户.假设有问题的Web应用程序足够安全,可以防止人们未经授权输入其他号码来查看其他用户,那么简单的顺序分配的代理键也会"泄露"实例总数(比这个旧),在本例中是用户,可能是特权信息.(例如,我是Stackoverflow中的用户#726.)

UUID/GUID是更好的解决方案吗?然后我可以像这样设置URL:

http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66

不是很简洁,但显示的关于用户的隐含信息较少.当然,它有点"默默无闻的安全"的味道,这不是替身的适当安全,但它至少看起来更安全一点.

这一好处是否值得为web可寻址对象实例实现UUID的成本和复杂性呢?我认为我仍然希望使用整型列作为数据库PK,只是为了加速联接.

还存在UUID的数据库内表示的问题.我知道MySQL将它们存储为36个字符的字符串.Postgres似乎有更有效的内部表示(128位?)但是我自己还没有试过.有谁有这方面的经验吗?


更新:对于那些询问只在URL中使用用户名(例如,http://example.com/user/yukondude)的人来说,这对于名称唯一的对象实例来说很好,但是对于那些真正只能通过数字识别的无数Web应用程序对象又如何呢?订单、交易、发票、重复图像名称、堆栈溢出问题.

推荐答案

我不能说你问题的网络方面.但是uuid对于n层应用程序非常有用.PK生成可以是分散的:每个客户端都可以生成自己的PK,而不会有冲突的风险. 而且速度差一般都很小.

确保数据库支持高效的存储数据类型(16字节,128位).

我已经在Firebird中广泛使用过它们,并推荐使用.

Database相关问答推荐

为什么postgres枚举需要4个字节?

Prisma - 将属性的类型设置为枚举数组

嵌入式的 best数据库是什么?

在 SQL Server 中找出调用存储过程

安装 SQL Server Management Studio Express后提示:Cannot open user default database. Login failed.

group by会自动保证order by吗?

如何在 2 个 MySQL 数据库之间传输数据?

使用varchar作为主键?

在 PostgreSQL 中使用 pg_notify(text, text) 监听/通知

在 SQL SERVER 中监视 SQL 查询的进度

如何使用 INSERT ... ON CONFLICT ... 更新所有列?

我们如何保存在 sqlite3 中创建的数据库

自动增量唯一标识符

在默认路径下使用脚本创建数据库?

是否有标准的Electron 商务数据库架构来将折扣/税收/礼券应用于产品?

有什么理由不应该在生产中使用 h2 数据库?

dbvisualizer:在 Select 查询中设置最大行数

使用批处理文件执行一组 SQL 查询?

多个和单个索引

数据库 EAV 优点/缺点和替代方案