MySQL 跨数据库网络的 UID 系统
MySQL UID system across a database network
我想在我的数据库中为我的员工创建唯一标识符,这是为了避免跨数据库重复,即如果员工 Barbra 存储在 DB1 中,我不希望在 DB2 中再次创建她。
我最初的想法是使用从员工电话号码创建的散列(例如 SHA-1)。
这样碰撞的可能性极低,并且值将是唯一的。
但是我知道拥有这么长的 UID 将花费额外的资源来执行查询,例如 SELECT,由于每个 UID 的大小,缺乏排序的结构和数据类型(VARCHAR ).
有没有人知道如何解决这个问题?
sha1
从生日开始是个坏主意,人们有相同的生日,无论哈希算法本身是否存在潜在冲突,您都可能会发生冲突。 运行ge 的输入是有限的(生日)。
有几种选择:
每个数据库都可以实现auto_increment_offset
每个数据库都可以实现由 (id, db_id)
组成的复合主键,其中 db_id
是数据库位置的数字唯一标识符。
你可以使用 UUID
,这似乎很昂贵,但如果没有 运行 的数据集大小和硬件,现在就假设任何事情还为时过早。 UUID
快速解决您的问题。您可以轻松地将 UUID
存储到 binary(16)
列中,从而为您提供固定宽度和低 space 占用空间(示例:select unhex(replace(uuid(), '-', ''))
.
我想在我的数据库中为我的员工创建唯一标识符,这是为了避免跨数据库重复,即如果员工 Barbra 存储在 DB1 中,我不希望在 DB2 中再次创建她。
我最初的想法是使用从员工电话号码创建的散列(例如 SHA-1)。 这样碰撞的可能性极低,并且值将是唯一的。
但是我知道拥有这么长的 UID 将花费额外的资源来执行查询,例如 SELECT,由于每个 UID 的大小,缺乏排序的结构和数据类型(VARCHAR ).
有没有人知道如何解决这个问题?
sha1
从生日开始是个坏主意,人们有相同的生日,无论哈希算法本身是否存在潜在冲突,您都可能会发生冲突。 运行ge 的输入是有限的(生日)。
有几种选择:
每个数据库都可以实现auto_increment_offset
每个数据库都可以实现由
(id, db_id)
组成的复合主键,其中db_id
是数据库位置的数字唯一标识符。你可以使用
UUID
,这似乎很昂贵,但如果没有 运行 的数据集大小和硬件,现在就假设任何事情还为时过早。UUID
快速解决您的问题。您可以轻松地将UUID
存储到binary(16)
列中,从而为您提供固定宽度和低 space 占用空间(示例:select unhex(replace(uuid(), '-', ''))
.