Mysql 在创建数据库时,对每个表中的所有主键进行散列是否是一种良好的做法?

Mysql 在创建数据库时,对每个表中的所有主键进行散列是否是一种良好的做法?,mysql,database,database-design,primary-key,database-security,Mysql,Database,Database Design,Primary Key,Database Security,不管表的重要性如何,对每个主键进行散列通常是一种好的做法,还是应该在决策中考虑存储的数据类型 [仅澄清问题] 我主要想知道的是数据库安全性:对于可能非常大的数据库,在字符串上使用md5哈希加密主键(就像在将主键输入DB表之前使用md5一样)与在表中使用自动增量ID加密主键是一种好的做法吗。 我目前正在开发一个应用程序,其中数据库的设计方式是在保存之前使用md5对每个表的主键进行加密,我想知道这是一种良好的做法,还是不必要的做法。正如@juergen回答的那样,当在关系表上指定主键时,具有关联的唯

不管表的重要性如何,对每个主键进行散列通常是一种好的做法,还是应该在决策中考虑存储的数据类型

[仅澄清问题] 我主要想知道的是数据库安全性:对于可能非常大的数据库,在字符串上使用md5哈希加密主键(就像在将主键输入DB表之前使用md5一样)与在表中使用自动增量ID加密主键是一种好的做法吗。
我目前正在开发一个应用程序,其中数据库的设计方式是在保存之前使用md5对每个表的主键进行加密,我想知道这是一种良好的做法,还是不必要的做法。

正如@juergen回答的那样,当在关系表上指定主键时,具有关联的唯一索引-这是DB引擎强制执行唯一性的方式

例如,如果您有一个字符串PK,那么数据库可能已经对其进行散列,以便存储在内部数据结构中。即使没有被DB引擎散列,在创建行时也可能会产生CPU开销


此外,一个表中的PK将是另一个引用/子表中的FK。您需要将这些散列键传播到其他地方。这也会使您的数据在某种程度上“无法读取”。

正如@juergen回答的那样,在关系表上指定主键时,主键具有关联的唯一索引-这就是DB引擎强制执行唯一性的方式

例如,如果您有一个字符串PK,那么数据库可能已经对其进行散列,以便存储在内部数据结构中。即使没有被DB引擎散列,在创建行时也可能会产生CPU开销

此外,一个表中的PK将是另一个引用/子表中的FK。您需要将这些散列键传播到其他地方。这也会使您的数据在某种程度上“无法读取”。

这是个坏主意。除了@blispr所指出的,伸缩性是一个严重的问题。这在使用uuid和guid时也会出现

当一个键(
主键
或其他)是“随机的”(如UUID、哈希等)时,“下一个”查找(对于
插入
选择
)将位于索引(和/或表)中的某个“随机”位置。当表很大时,这意味着所需的块不太可能在缓存中。在极端情况下(索引大小比缓存大得多),缓存将被重击,每次读写操作大约需要一次磁盘命中。在传统的硬盘上,大约每秒点击100次。这对于大桌子来说是不够的

因此,你在某个地方读到“保持
主键
小?在方便的时候这样做;不要走开。例如,“国家代码”。国家不到256个,因此你可能会尝试使用
TINYINT UNSIGNED
,它需要1个字节。我主张使用标准的2字母代码和
CHAR(2)字符集ascii
,需要2个字节。更简单、可读性更强,而且大小不够重要

编辑

自动增量通常(但并非总是)更好,因为它是“按时间顺序”的“。也就是说,'old'条目的ID较小,并且位于表/索引的一端;”“新”条目位于另一端。在许多应用程序中,大多数活动都与“新”条目一起进行,因此它们往往被缓存,而“旧”条目则保持在磁盘上,不受干扰

无论我所在行的
主键是'RickJames'还是'12345'还是'827ccb0eea8a706c4c34a16891f84e7b',我看不到“安全性”有多大区别。不要混淆“模糊性”和“安全性”

另一方面,如果我的id是12345,黑客可以很容易地假设12346和12347可能是有效的id,并可以尝试获取他们的信息。如果这是您的问题,那么继续使用12345,但也有一些随机值(不能从12345派生)作为第二个值,用于验证id是否未被入侵。将该值存储在db中进行测试;你不需要索引它。(因此,它不会影响我以前的评论。)此外,ID、安全代码等可能最好通过cookie传递,而不是URL。

这是个坏主意。除了@blispr所指出的,伸缩性是一个严重的问题。这在使用uuid和guid时也会出现

当一个键(
主键
或其他)是“随机的”(如UUID、哈希等)时,“下一个”查找(对于
插入
选择
)将位于索引(和/或表)中的某个“随机”位置。当表很大时,这意味着所需的块不太可能在缓存中。在极端情况下(索引大小比缓存大得多),缓存将被重击,每次读写操作大约需要一次磁盘命中。在传统的硬盘上,大约每秒点击100次。这对于大桌子来说是不够的

因此,你在某个地方读到“保持
主键
小?在方便的时候这样做;不要走开。例如,“国家代码”。国家不到256个,因此你可能会尝试使用
TINYINT UNSIGNED
,它需要1个字节。我主张使用标准的2字母代码和
CHAR(2)字符集ascii
,需要2个字节。更简单、可读性更强,而且大小不够重要

编辑

自动增量通常(但并非总是)更好,因为它是“按时间顺序”的“。也就是说,'old'条目的ID较小,并且位于表/索引的一端;”“新”条目位于另一端。在许多应用程序中,大多数活动都与“新”条目一起进行,因此它们往往被缓存,而“旧”条目则保持在磁盘上,不受干扰

无论我所在行的
主键是否为“RickJames”