我知道 GUID 几乎是唯一的。但是假设它是独一无二的是可以接受的做法吗?
I know a GUID is nearly unique. But is it acceptable practice to assume it is unique?
所以我完全理解用相同的数字创建两个 GUID 值的数学可能性。但是假设它们是独一无二的是可以接受的做法吗?
例如,我正在使用一个处理医疗文件的系统。当我开始布局数据库结构时,经理(不是很懂技术,但喜欢认为他是,并且委托一些事情最好留给更有技术头脑的人来决定)说他想使用 GUID 来分隔不同的医疗记录INT 因为它是 "More unique"。我解释了 INT 如何始终是唯一的,因为它是连续的。我建议我们使用 BigINT,如果它能让他感觉更舒服,因为里面有更多的数字,那么如果地球上的人口增加到人们只适合在地球上挨着站着的程度,但他坚持使用GUID。
我的感觉是,虽然几乎不可能搞混,但在处理病历时,何必冒这个险呢?在这种情况下使用 GUID 与 INT 有什么优势?
使用递增的整数 ID 确保仅在它自己的 domain/type 中唯一,UUIDs/GUIDs 的一个优点是它们在 thing整个宇宙。
因此,如果您有多个对象,例如 MedicalRecord, ID = 5
、VaccinationForm, ID = 5
,那么您需要同时指定类型("medicalRecord" 或 "vaccinationForm",ID 值为 5
) 而对于 GUID,您只需要存储单个信息量来唯一标识它。
可以说使用 GUID 是一种浪费 space,因为它们有 16 个字节长(128 位值)。
如果您的系统是独立的并且不与其他系统交互,您可能想使用 SQL 服务器的 "sequence" 概念,而不是每个 table 存储自己的标识序列,该序列为所有 table 维护,使其成为本地唯一 ID 值。您也可以使用任何大小的整数。
But is it acceptable practice to assume it is unique?
是的。这就是 UUID, to be used as a reliable unique identifier without centralized coordination. (A GUID 的全部目的是 Microsoft 的 UUID 变体。)
只有您(或您的适当管理人员)才能对您的特定项目做出最终判断。
但是如果你真正开始意识到 12x 位的数字范围的巨大性(这实际上是人类思维无法理解的),那么你就会知道你可以从你的担忧列表中删除正确生成的 UUID 的使用.
我所说的“正确生成”是指使用日期时间版本,或者如果有加密强随机数生成器支持,则对于较少数量的值使用随机数(版本 4)。今天几乎每个现代操作系统都包含一个 UUID 生成库。或者您可以使用 OSSP UUID 项目。 不正确的生成将包括您自己的实现,您可能会看到关于互联网的恶意攻击。
至于使用数据库的自动递增 serial/sequence 数字的建议,我认识的每个具有多年实际经验的数据库人员都被这些建议烧毁了。我从未听说过或读过任何人与正确生成的 UUID 发生冲突。我并不是说序列一定是坏的或没有它们的位置,我只是说当我听到人们因为 UUID 的一些超天文难以理解的微小可能性而远离 UUID 时,我所能做的就是笑碰撞并选择一个序列。
when dealing with medical records, why take the chance?
由于错误的数据输入或处理记录的其他人为错误,您的医疗系统更有可能发生故障。但是,您 post 3 名值班职员会独立地三次输入相同的数据以减少出错的可能性吗?不。而且这种风险在数学上比 UUID 问题更有可能发生。然而,我所知道的每家医疗机构都没有考虑就接受了这种巨大的风险。
What is the advantage of using a GUID vs an INT
优势包括:
- 无需管理您的序列。
示例包括:为开发、测试和生产环境重置。或者在恢复备份时。或者在系统的串口生成库出错后修复序列(我自己的经验)。
- 避免用户的直觉假设混淆序列中缺失的数字。
我经常有这样的谈话。
- Federating data分布式系统之间。
这是最大的优势,每个系统都可以独立行动,但很容易与其他系统来回共享数据。如果没有 UUID,管理开销和出错风险一开始会很麻烦,而且只会随着时间的推移而增加。
缺点包括:
- 更大的内存和存储使用。
序列号通常是 32 位整数,有时是 64 位。 good database 本机支持 UUID 作为数据类型将使用 128 位。
- 人类可读性较差。
一个解决方法是在临时工作中只读取几个第一个或最后一个数字。
- 索引效率可能较低,条目数量非常多。
所以我完全理解用相同的数字创建两个 GUID 值的数学可能性。但是假设它们是独一无二的是可以接受的做法吗?
例如,我正在使用一个处理医疗文件的系统。当我开始布局数据库结构时,经理(不是很懂技术,但喜欢认为他是,并且委托一些事情最好留给更有技术头脑的人来决定)说他想使用 GUID 来分隔不同的医疗记录INT 因为它是 "More unique"。我解释了 INT 如何始终是唯一的,因为它是连续的。我建议我们使用 BigINT,如果它能让他感觉更舒服,因为里面有更多的数字,那么如果地球上的人口增加到人们只适合在地球上挨着站着的程度,但他坚持使用GUID。
我的感觉是,虽然几乎不可能搞混,但在处理病历时,何必冒这个险呢?在这种情况下使用 GUID 与 INT 有什么优势?
使用递增的整数 ID 确保仅在它自己的 domain/type 中唯一,UUIDs/GUIDs 的一个优点是它们在 thing整个宇宙。
因此,如果您有多个对象,例如 MedicalRecord, ID = 5
、VaccinationForm, ID = 5
,那么您需要同时指定类型("medicalRecord" 或 "vaccinationForm",ID 值为 5
) 而对于 GUID,您只需要存储单个信息量来唯一标识它。
可以说使用 GUID 是一种浪费 space,因为它们有 16 个字节长(128 位值)。
如果您的系统是独立的并且不与其他系统交互,您可能想使用 SQL 服务器的 "sequence" 概念,而不是每个 table 存储自己的标识序列,该序列为所有 table 维护,使其成为本地唯一 ID 值。您也可以使用任何大小的整数。
But is it acceptable practice to assume it is unique?
是的。这就是 UUID, to be used as a reliable unique identifier without centralized coordination. (A GUID 的全部目的是 Microsoft 的 UUID 变体。)
只有您(或您的适当管理人员)才能对您的特定项目做出最终判断。
但是如果你真正开始意识到 12x 位的数字范围的巨大性(这实际上是人类思维无法理解的),那么你就会知道你可以从你的担忧列表中删除正确生成的 UUID 的使用.
我所说的“正确生成”是指使用日期时间版本,或者如果有加密强随机数生成器支持,则对于较少数量的值使用随机数(版本 4)。今天几乎每个现代操作系统都包含一个 UUID 生成库。或者您可以使用 OSSP UUID 项目。 不正确的生成将包括您自己的实现,您可能会看到关于互联网的恶意攻击。
至于使用数据库的自动递增 serial/sequence 数字的建议,我认识的每个具有多年实际经验的数据库人员都被这些建议烧毁了。我从未听说过或读过任何人与正确生成的 UUID 发生冲突。我并不是说序列一定是坏的或没有它们的位置,我只是说当我听到人们因为 UUID 的一些超天文难以理解的微小可能性而远离 UUID 时,我所能做的就是笑碰撞并选择一个序列。
when dealing with medical records, why take the chance?
由于错误的数据输入或处理记录的其他人为错误,您的医疗系统更有可能发生故障。但是,您 post 3 名值班职员会独立地三次输入相同的数据以减少出错的可能性吗?不。而且这种风险在数学上比 UUID 问题更有可能发生。然而,我所知道的每家医疗机构都没有考虑就接受了这种巨大的风险。
What is the advantage of using a GUID vs an INT
优势包括:
- 无需管理您的序列。
示例包括:为开发、测试和生产环境重置。或者在恢复备份时。或者在系统的串口生成库出错后修复序列(我自己的经验)。 - 避免用户的直觉假设混淆序列中缺失的数字。
我经常有这样的谈话。 - Federating data分布式系统之间。
这是最大的优势,每个系统都可以独立行动,但很容易与其他系统来回共享数据。如果没有 UUID,管理开销和出错风险一开始会很麻烦,而且只会随着时间的推移而增加。
缺点包括:
- 更大的内存和存储使用。
序列号通常是 32 位整数,有时是 64 位。 good database 本机支持 UUID 作为数据类型将使用 128 位。 - 人类可读性较差。
一个解决方法是在临时工作中只读取几个第一个或最后一个数字。 - 索引效率可能较低,条目数量非常多。