我目前正在开发一个包含各种类型实体的基于网络的新项目。该服务可通过 REST API 访问,我正在考虑以下端点:
api.example.com/users/{user_id}
对此,我认为为用户提供自动增量 ID 将是一个糟糕的方法,因为任何人都可以点击:
api.example.com/users/1
,然后 api.example.com/users/2
, api.example.com/users/3
,等等。
现在,我正在考虑使用 UUID,但我不知道这是否是一个好主意,因为它是 VARCHAR(36)
。由于这些原因,当我在 INSERT 查询上生成用户 ID 时,我会执行类似的操作(我使用的是 MySQL):
unhex(replace(uuid(),'-',''))
这样,我将 UUID 转换为二进制。我正在存储一个 BINARY(16)
而是在数据库上。
当我想从数据库中检索信息时,我可以使用类似的东西:
SELECT hex(id), name FROM user;
和
SELECT hex(id), name FROM user WHERE hex(id) = '36c5f55620ef11e7b94d6c626d968e15';
所以,我正在使用十六进制形式,但以二进制形式存储它。
这是一个好方法吗?
最佳答案
几乎就在那里...
索引是您的性能 friend 。大概id
已被索引,那么
WHERE id = function('...')
使用索引并直接转到行,但是
WHERE function(id) = '...'
不能使用索引;相反,它会扫描所有行,检查每一行。对于一张大 table 来说,这太慢了。
所以...
用它来存储它:
INSERT INTO tbl (uuid, ...)
VALUES
(UNHEX(REPLACE(UUID(), '-', '')), ...);
这是为了测试它:
SELECT ... WHERE
uuid = UNHEX(REPLACE('786f3c2a-21f6-11e7-9392-80fa5b3669ce', '-', ''));
如果您选择发送(通过 REST)不带破折号的 32 个字符,您可以计算出微小的变化。
由于这很乏味,因此构建一对存储函数。哦,我有一个给你;请参阅http://mysql.rjweb.org/doc.php/uuid 。 这还讨论了为什么 UUID 对于大型表来说效率低下,以及解决它的可能方法。
关于php - 使用什么样的 ID 以及如何将其存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43423571/