【发布时间】:2011-03-15 15:35:07
【问题描述】:
我们需要将 UUID 添加到我们的大多数对象和数据库表中。
除了序列生成的代理键之外,您会使用 UUID 作为代理键还是自然键,即使用私有代理键并另外添加列/属性来保存 UUID?
我看到它经常直接用作代理/主键。不知怎的,我不喜欢这个主意。
人们可能会将 UUID 视为自然键,因为它应该是具有全局意义的唯一标识符,就像任何其他自然键一样,独立于系统的特定实现,即如果您将数据移动到另一个系统中,UUID 必须保持不变,而根据定义,代理键没有真正和持久的含义。
也许我应该澄清更多:假设我们有一个 Account 表。传统上会有一些内部代理键和一个由帐号组成的自然键(如打印在帐户报表等上)。
虽然 UUID 不像帐号那样“可读”,但我认为 UUID 更像是自然密钥,因为它可以起到与帐号相同的作用:以唯一且不变的方式引用特定帐户方式。 (传统的)代理键永远不会出现在系统之外,因为它是完全私有的并且可以随时更改,因此不能存在任何外部引用。
从这个意义上说,UUID 不是典型的代理键 (?)。
【问题讨论】:
-
自然键是根据数据创建键而形成的。 UUID 是代理键,只是全局唯一的代理。
-
@andrey:一旦选择了特定类型的代理键,就很难改变。我知道我们将有数百万个对我们所有“帐户”的引用,即大外键会大大增加数据库大小,需要更多 I/O,读取更多物理文件块等。优化不是必然为时过早。
-
@Andrey,为您的数据确定正确的域不是过早的优化。字段大小影响:所有 I/O、索引大小、数据存储要求、备份;对于数据的任何扫描检索,这直接转化为性能,对于查找不是直接的,但仍然会产生影响。
-
@Andrey,只有傻瓜才不会在设计阶段尝试优化数据库。由认为所有优化都为时过早的开发人员设计的数据库在拥有 100,000,00 条记录并且设计从一开始就是一个糟糕的选择时就很难修复。这不是过早的优化,因为这种选择会影响几乎所有的查询和性能。
-
@Andrey,“不会影响性能太多。” - 很棒的推理;)
标签: database-design uuid