说我有以下表格:
Foo
- id
- code (Unique)
- name
- descption
Bar
- id
- foo_code
Bar.foo_code
指向Foo.code
是否存在劣势?一般来说,我看到引用了id(例如,会有一个Bar.foo_id
指向Foo.id
),但在我的情况下,如果它实际指向除了{{1}}以外的其他东西会更简单自动递增PK。
我很好奇这是不好的设计还是会以某种方式对表现造成惩罚。
答案 0 :(得分:2)
不,没有缺点。可能在可读性上,取决于列的真实名称。但请注意,如果Foo.code是唯一的,那么它实际上是主键。只要确保它也被编入索引并且你是金色的。如果Foo.code实际上是唯一的,那么你甚至可以摆脱Foo.id并节省一些空间。
答案 1 :(得分:2)
如果你真的使用另一个密钥作为主键,你有什么理由保持自动递增id
?
默认情况下,表将在主键上排序。默认情况下,按code
排序可能更有意义。此外,它还需要更多的数据存储,并且由于两个索引都必须更新,因此更新速度会慢一些。对于许多应用程序而言,性能差异会产生很小的实际差异,但如果您不使用它,我就无法想到保持自动增量ID的原因。
代理主键确实有它们的用途,但是如果你已经有一个你想要用作主键的唯一列,那么使用那个唯一的列作为你的PK而不是糟糕的设计。
答案 2 :(得分:0)
取决于您打算如何查询:
code
相关联的Bar
,则直接在FK中引用它从<{1}}迁移到Foo
1}},允许你这样做没有一个JOIN。Bar
或Foo.name
,那么JOIN是不可避免的,并且引用Foo.descption
可以避免支付双重查找价格caused by the MySQL/InnoDB clustering。话虽如此,您可以remove the surrogate key Foo.id
,消除整个困境。