我知道GUID几乎是唯一的。但是假设它是唯一的是可接受的实践吗?

3
所以我完全理解使用相同数字创建两个GUID值的数学上的不可能性。但是假设它们是唯一的,这是可接受的做法吗?
例如,我正在处理医疗文件的系统。当我开始布置数据库结构时,经理(他不太懂技术,但喜欢认为自己很懂,并委托那些更有技术头脑的人来决定)说他想使用GUID来分离不同的医疗记录,而不是INT,因为它“更唯一”。我解释了INT始终是唯一的,因为它是顺序的。如果他感到更舒适,我建议我们使用BigINT,因为其中的数字比人类在地球上站在一起的数量还多,但他坚持要使用GUID。
我的感觉是,尽管出现混淆的可能性几乎不可能,但在处理医疗记录时,为什么要冒险呢?在这种情况下,使用GUID与使用INT相比有什么优势?

1
优势是不存在的。 - Drew
我了解。我完全理解手头的问题。在我将其提升到另一个层面之前,我只是想确认自己没有漏掉任何事情。 - Cade
1
GUID的一个优点是,如果您将在不同的医院/医疗中心运行多个独立系统,则可以使用GUID。对于数字ID,来自一个医院的病历很可能与另一个医院的病历具有相同的ID。对于GUID,医疗记录将几乎是唯一的。 - cha
2
把它提升到另一个层级。因为当你意外地向约翰分享了莎莉的医疗记录时,HIPAA(美国健康保险可移植性与责任法案)会追究你的责任,最后你可能只能去卖炸薯条。 - Drew
您的经理可能也会阅读这篇内容 - cha
显示剩余4条评论
2个回答

5

但是假设它是唯一的,这种做法可接受吗?

可以。 这就是UUID的全部目的,用作可靠的唯一标识符而无需集中协调。(GUID是微软对UUID的变体。)

只有您(或您适当的管理层)才能为您特定的项目做出最终判断。

但是,如果您真正开始欣赏12x位数值范围的巨大性(这实际上是人类无法理解的),那么您就知道可以从您的担忧列表中删除正确生成的UUID的使用。

“properly generated”指的是使用日期时间版本或在数值较低时使用随机数(版本4),如果由加密强度随机数生成器支持。几乎每个现代操作系统都包括UUID生成库。或者您可以使用OSSP UUID项目。“不当生成”包括您可能在互联网上看到的自行实现。
至于建议使用数据库的自动递增序列号,我认识的所有有多年实际经验的数据库人员都曾受过它们的伤害。我从未听说过或读过任何人使用正确生成的UUID发生冲突的情况。我并不是说序列一定不好或没有它们的用处,我只是说当我听到人们因为UUID的碰撞可能性超出天文数字而选择序列时,我只能笑笑而已。

处理医疗记录时,为什么要冒这个险?

你的医疗系统更容易因为数据输入错误或其他人为操作记录错误而失败。但是,你会安排三名职员独立地多次输入相同的数据以减少出错的可能性吗? 不会。这种风险在数学上发生的可能性比UUID问题难以理解的大。然而,我所知道的每个医疗机构都毫不考虑地接受了这种巨大的风险。
“使用GUID与使用INT相比有哪些优势?”
优势包括:
- 无需管理序列。例如:重置开发、测试和生产环境。或在恢复备份时。或者在系统的序列生成库存在故障后修复序列 (我的个人经验)。 - 避免用户对序列中缺失数字的直观假设被混淆。我太常遇到这种情况了。 - 在分布式系统之间联邦数据。这是最大的优势,每个系统可以独立地运作,同时轻松地与其他系统分享数据。没有UUID,行政管理的开销和出错的风险一开始就很麻烦,而且会随着时间的推移而增加。
缺点包括:
  • 内存和存储使用更大。
    序列号通常是32位整数,有时为64位。具有原生UUID数据类型支持的良好数据库将使用128位。
  • 对人类来说可读性较差。
    一种解决方法是仅在日常工作中阅读前几个或最后几个数字。
  • 可能存在索引效率较低的情况,当条目数量非常大时。

另一个选择是同时使用GUID和顺序ID,分别用于外部和内部标识,尽管这将表示一种反规范化。 - Dai
@Dai 是的,在某些情况下,同时使用UUID和序列是合理的。并不一定是非规范化的。UUID是真正的ID,也是主键。序列告诉你它们被添加到数据库的顺序,这与UUID有不同的意义和目的。此外,设置一个触发器,在行创建时自动记录日期时间,也可以达到类似的目的。只需注意,由于事务的原因,创建和写入可能发生在不同的时刻。 - Basil Bourque

4
使用递增整数ID可以确保其在自己的域/类型内唯一,UUIDs/GUIDs的优点是它们可以在整个宇宙中唯一地标识所拥有的“事物”。因此,如果您有多个对象,比如MedicalRecord, ID = 5VaccinationForm, ID = 5,那么您需要同时指定类型(“medicalRecord”或“vaccinationForm”)和ID值5,而使用GUID时,您只需要存储一个信息量即可唯一标识它。可以说,使用GUID会浪费空间,因为它们长度为16字节(128位值)。如果您的系统是独立的且不与其他系统接口,则可能希望使用SQL Server的“序列”概念,其中每个表不再存储自己的身份序列,而是为所有表维护序列,使其成为本地唯一ID值。您也可以使用任何大小的整数。请参见这里:https://msdn.microsoft.com/en-us/library/ff878091.aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接