随机字符串作为代理键

时间:2015-11-18 00:22:48

标签: sql database-design

我是初学SQL用户,并尝试培养良好的设计技能。我有一个问题是如何使用主键。现在,我的代码生成8个字符的随机字符串(字母和数字),并在创建新记录时使用它。对于后续记录,它会生成另一个随机密钥,检查它是否已存在于数据库中,然后使用它(如果它不存在)或生成一个新的并重复。与仅使用自动增量列相比,此方法有任何价值吗?我真的没有特别的理由使用这种方法,但我可以发誓我读过有人使用这样的东西作为主键 - 只是不记得为什么。

2 个答案:

答案 0 :(得分:2)

您是否需要通过混淆来保护安全?密钥可能泄漏一些数据。主要是将记录插入表中的相对时间。了解这一点,您可以推断出一些数据。例如,如果它是出生表,您可以根据键猜测一些年龄。如果您需要对数据进行匿名化,那通常是在需要随机密钥时。

如果没有,只需使用自动增量。

如果你这样做,最好使用一个数字作为密钥。另外,您还没有说过您正在使用哪个DBMS,但其中一些DBMS带有生成随机数字密钥的方法。

答案 1 :(得分:1)

我曾经不得不使用随机字符串作为密钥的唯一原因是我希望在一个数据库实例中生成的记录与在另一个实例中生成的记录不具有相同密钥的概率很高。在这种情况下,我使用GUID,它基本上是一个随机生成的字符串,足够长,以至于在下一个十亿年内获得重复的概率很小。我已经在例如我们在登台数据库和实时数据库上创建记录的情况下使用过,我们希望将数据从登台数据库复制到实时数据库,而不会覆盖直接在实时数据库上创建的数据。

正如@Rabbit所说,可能存在安全问题。除了他提到的那个之外,假设您为记录分配了序列号,并且用户看到他获得了/read_secret_data.php?id=132的URL。他可能会尝试/read_secret_data.php?id=131,看看他得到了什么。如果数据确实是秘密的,那么您当然应该具有安全性,而不是希望没有人会猜出有效的ID,比如密码。但是,为什么让黑客比你更容易?

所有这一切,我几乎从不使用随机生成的密钥。大多数情况下,它只会增加额外的痛苦。