繁体   English   中英

使用uuid作为主要和/或代理键?

[英]Use uuid as primary and/or as surrogate key?

我们需要将UUID添加到大多数对象和数据库表中。

您是否将UUID用作代理键,或者更确切地说,除了序列生成的代理键之外还使用自然键,即使用私有代理键并另外添加列/属性来保存UUID?

我看到它经常被直接用作代理/主键。 不知怎的,我不喜欢这个主意。

可以将UUID视为自然键,因为它应该是具有全局含义的唯一标识符,就像任何其他自然键一样,独立于系统的特定实现,即如果您将数据移动到另一个系统, UUID必须保持不变,而根据定义,代理键没有真正和持久的含义。

也许我应该澄清更多:假设我们有一个账户表。 传统上会有一些内部代理密钥和一个由帐号组成的自然密钥(在帐户报表上打印等)。

虽然UUID不像帐号那样“可读”,但我会将UUID视为更自然的密钥,因为它可以起到与帐号相同的目的:以独特且不变的方式引用特定帐户。 (传统的)代理密钥永远不会出现在系统之外,因为它完全是私有的,可以随时更改,不需要外部引用。

从这个意义上说,UUID不是典型的代理键(?)。

你混合了一些东西。

1)代理键有两种定义

代理(1)

该定义基于Hall,Owlett和Todd(1976)给出的定义。 在这里,代理人代表外部世界的一个实体。 代理由系统内部生成,但对用户或应用程序仍然可见。

代理(2)

该定义基于Wieringa和De Jonge(1991)给出的定义。 这里代理表示数据库本身中的对象。 代理由系统内部生成,对用户或应用程序是不可见的。

代理(1)定义定义了它在数据模型中的用法,而不是存储模型,并在本文中使用。 见日期(1998年)。

(来自wiki关于代理键的条目;阅读文章有点怀疑 - 例如引用' 代理键的加入成本较低(要比较的列数较少),复合键 '表面看起来似乎合理,但是自然复合键将创建自然排序和隔离的索引,允许在浏览或分析数据时进行非常有效的扫描,同样由于返回包含多行的结果集的逻辑连接实际上可以执行得更好)

无论如何,考虑到从数据模型的角度来看代理键的时候,你应该考虑你所谓的“传统”的定义。

2)考虑UUID自然键的逻辑非常滑

引用你的问题:

我会将UUID视为更自然的密钥,因为它可以起到与帐号相同的目的:以独特且不变的方式引用特定帐户。

这不是自然键与代理键的定义或区别特征。 自然键具有以下属性(来自wiki ):

自然键是与该行内的属性具有逻辑关系的候选键。 自然密钥有时称为域密钥。

与没有这种逻辑关系的代理键相比,自然键的主要优点是它已经存在; 无需在架构中添加新的人工列。 使用自然密钥(当可以识别一个密钥时)也可以简化数据质量:它确保密钥只能有一行; 这个“真相的一个版本”可以被验证,因为自然的关键是基于现实世界的观察。

通常,UUID与同一行的属性之间没有逻辑关系。 但是,如果UUID由外部系统分配,并且您已经要求将它们存储为属性,则您具有该逻辑(类似于您可以将序列号或社会安全号视为自然键)。

只有在这个意义上,UUID可能会停止成为一个密钥,但你仍然可能(也可能会)拥有同一行的另一个候选键的更强大和更丰富的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM