【问题标题】:What kind of ID to use and how to store it in the database?使用什么样的 ID 以及如何将其存储在数据库中?
【发布时间】:2017-09-11 10:10:20
【问题描述】:

我目前正在开发一个新的基于 Web 的项目,其中包含各种类型的实体。该服务可通过 REST API 访问,我正在考虑以下端点:

api.example.com/users/{user_id}

为此,我认为用户的自动增量 ID 将是一个不好的方法,因为任何人都可以点击: api.example.com/users/1,然后是api.example.com/users/2api.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';

所以,我正在使用十六进制形式,但以二进制形式存储它。
这是个好方法吗?

【问题讨论】:

  • 对用户 ID 使用普通的自动增量列没有任何问题。您需要设置会话管理以防止未经授权的尝试访问 REST 端点。切换到 UUID 对安全性影响不大。

标签: php mysql database performance uniqueidentifier


【解决方案1】:

差不多在那里...

索引是您的性能朋友。大概id被索引了,那么

WHERE id = function('...')

使用索引并直接进入行,但是

WHERE function(id) = '...'

不能使用索引;相反,它扫描所有行,检查每一行。对于一张大桌子,这太慢了。

所以...

用它来存储它:

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 对于大表效率低下,以及一种可能的解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多