所以我完全理解用相同的数字创建两个GUID值的数学不可靠性。但是,假设它们是独一无二的,这是否可以接受呢?
例如,我正在使用一个处理医疗文件的系统。当我开始布局数据库结构时,管理员(技术上不是很了解,但他喜欢认为他是并且委托最好留下更专业的人决定的东西)说他想用GUID来分隔不同的医疗记录而不是因为它是“更独特”的INT。我解释了INT如何始终是唯一的,因为它是顺序的。我建议我们使用BigINT,如果它会让他感觉更舒服,因为当时有更多的数字,如果地球的人口增加到人们只能在地球上彼此相邻的点,但他坚持使用的GUID。
我的感觉是,虽然在处理医疗记录方面几乎是不可能的,但为什么要抓住机会呢?在这种情况下使用GUID与INT有什么好处?
答案 0 :(得分:4)
使用递增的整数ID确保其自身的域/类型中只有唯一性,UUID / GUID的一个优点是它们可以唯一地标识整个Universe中拥有的 thing 。
因此,如果你有多个对象,比如说MedicalRecord, ID = 5
,VaccinationForm, ID = 5
那么你需要同时指定类型(“medicalRecord”或“vaccinationForm”,ID值为5
)而使用GUID,您只需存储一个量子信息即可唯一识别它。
可以说使用GUID是浪费空间,因为它们长度为16个字节(128位值)。
如果您的系统是独立的并且没有与其他系统连接,您可能希望使用SQL Server的“序列”概念,而不是每个表存储其自己的标识序列,为所有表维护序列,使其成为本地 - 独特的ID值。您也可以使用任何大小的整数。
答案 1 :(得分:4)
但是,假设它是独一无二的,这是否可以接受呢?
是。这是UUID的全部目的,在没有集中协调的情况下用作可靠的唯一标识符。 (GUID是Microsoft对UUID的变体。)
只有您(或您的适当管理层)才能对您的特定项目做出最终判断。
但是如果你真的开始意识到12x位数字范围的巨大(这对于人类的思维来说实际上是不可理解的),那么你知道你可以从你的担忧列表中删除正确生成的UUID的使用。
通过“正确生成”我的意思是使用日期时间版本,或者对于较低数量的值使用随机(版本4),如果由加密强随机数生成器支持。现在几乎每个现代操作系统都包含一个UUID生成库。或者您可以使用OSSP UUID项目。 不正确的生成将包括你自己的实施,你可能会看到有关网络间的信息。
至于使用数据库的自动递增序列号/序列号的建议,我认识的具有多年实际经验的每个数据库人员都被这些人烧掉了。我从来没有听说过任何与正确生成的UUID发生冲突的人。我并不是说序列一定是坏的或者没有他们的位置,我只是说当我听到人们因为一些超天文学的转变而离开UUID时我所能做的就是笑难以理解的UUID碰撞的可能性很小,而是选择一个序列。
在处理医疗记录时,为什么要抓住机会呢?
由于数据输入错误或处理记录中的其他人为错误,您的医疗系统更有可能失败。但是你是否会派出3名值班人员独立三次输入相同的数据以减少出错的几率?没有。与UUID问题相比,这种风险在数学上难以理解。然而,我所知道的每一家医疗机构都承认这种巨大的风险,甚至没有考虑过它。
使用GUID与INT
的优点是什么?
优势包括:
缺点包括: