我有2个表:Users
和Locales
。
Locales(id, name, code)
Locales.name是locale的英文名称(例如'Spanish'),Locales.code是locale的5 char代码(例如'en_us')。每个用户都应该有一个区域设置。我想到了两个选择:
LocaleId
列为FK Locales.id
。locale (string)
列作为FK到Locales.code
列哪种方法会更好?请注意,我将不得不在某些区域设置中搜索用户,在区域设置字段等其他表上执行某些连接。
答案 0 :(得分:1)
在您的表中,您在ID中有(我假设的)系统生成的值。这是你的代理钥匙。但是,您在Code中也有一个自然键值。是的,您可以在Code上定义唯一约束,以便外键可以引用它。但是,如果你这样做,为什么不继续把它作为你的主要钥匙呢?
在这个问题上仍然存在着长期存在的争论。
有一方面对问题 - 这是一个很好的案例 - 它必须是所有案例中的所有案例方面,并要求所有表格都有一个代理键。
我不同意。让我们看看如果您完全丢弃ID字段并使Code成为表格的PK,会发生什么。
好的一面:
在负面:
那么哪种情况更适合您的特定情况?
我不知道。
您和您的团队必须权衡利弊,做出自己的决定。