【发布时间】:2010-12-04 22:07:31
【问题描述】:
这是我最近一直在考虑的另一个问题。 我们在前面的讨论中得出结论:“自然主键不好,人工主键好。” 之前使用 Hibernate 我已经看到 Hibernate 默认为所有表创建一个序列。起初我对此感到困惑,你为什么要这样做。但后来我看到了它的好处,它使连接父母和孩子变得万无一失。由于没有表具有相同的主键值,因此意外将父表与非子表链接不会产生任何结果。
有没有人认为这种方法有任何缺点。我只看到一个:您的数据库中的记录不能超过 999999999999999999999999999。
【问题讨论】:
-
“我们已经在之前的讨论中得出结论”——内部讨论还是关于 SO 的?
-
关于 SO 的几次讨论。而“我们”的意思是“我”;-)
-
自然键并不“坏”。从数据完整性的角度来看,它们是必不可少的。它们允许用户识别数据库中正在识别的真实世界事物。原则上,序列也可以是自然键。实际上,我更喜欢“业务密钥”一词,但它与“自然密钥”的含义相同 - 即用于识别数据库外部信息的密钥(例如由业务用户)。
-
@dportas - 自然键很有用,尽管在应用程序中使用自然键作为主键/@@Id 字段可能很糟糕,当您的应用程序是这些值的记录系统时这些值可能需要稍后更改。多年前,当我将 username 设置为 @@Id 列时,我很难学到这一点(好吧,当时没有注释)。这是一个清晰的自然键——具有商业意义的唯一记录标识符。唯一的问题是,如果您需要更改它并且有 10 个其他表使用它作为外键怎么办?