基于跨系统的数据库中的唯一对象名创建数字键?

时间:2011-03-02 01:09:50

标签: sql sql-server hash foreign-keys key

我有一个数据库,它使用唯一的文本键来链接对象。例如,插入用户时,会插入文本键“{date} - {system} - {user}”,其中键的每个元素都是字母数字。然后根据查找表检查它是否存在,如果不存在则将其插入表中并创建自动增量整数键。否则,将重复使用相同的整数键。

然后,如果插入该用户的唯一属性,则将其匹配并将用户的数字键指定为外键。例如,使用用户密钥“{date} - {system} - {user}”插入该用户独有的文档,并为文档“{date} - {system} - {user- {document}添加唯一的文本密钥“从中生成一个整数键。

这样,有一个数字键关联这两个条目,文档有一个唯一的键用于附加属性。这些用于各种查询。

问题是当然,各个系统的键不同,取决于插入元素的方式和时间。所以,我最初的想法是使用哈希作为生成的密钥,但我认为int和bigint相当有限。

我不确定SQL服务器如何处理外键的长字符串哈希,我已经读过它在性能方面做得不好。否则,我可以使用正在创建密钥的文本。

假设文本键是唯一的,您将如何确保int,bigint或字符串(如果可信)键在系统中是唯一的?哈希?一个GUID?如果使用bigint(63位?)位密钥,如何处理哈希冲突怎么办?

谢谢!

1 个答案:

答案 0 :(得分:1)

John,如果可能,您可以重新考虑您的密钥体系结构,因为这是使用GUID作为密钥的理想情况。这样你就可以为任何系统上的任何用户生成唯一的密钥,并且99.999999999999 .......%保证不会有任何冲突。这也只有16个字节。您始终可以将现有密钥结构保留为另一列,但仅用于其他目的,而不是识别或使记录唯一。我建议只有当你的应用程序使用这些信息来执行某些任务时才会这样,如果没有,完全摆脱它。

在这种情况下使用GUID作为键的好处是它与平台无关,即。你可以在Oracle,SQL Server,unix,windows ....上使用它。