数据库关系:不使用PK?

时间:2014-07-20 22:27:44

标签: mysql database database-design

说我有以下表格:

Foo
 - id
 - code (Unique)
 - name
 - descption

Bar
 - id
 - foo_code

Bar.foo_code指向Foo.code是否存在劣势?一般来说,我看到引用了id(例如,会有一个Bar.foo_id指向Foo.id),但在我的情况下,如果它实际指向除了{{1}}以外的其他东西会更简单自动递增PK。

我很好奇这是不好的设计还是会以某种方式对表现造成惩罚。

3 个答案:

答案 0 :(得分:2)

不,没有缺点。可能在可读性上,取决于列的真实名称。但请注意,如果Foo.code是唯一的,那么它实际上是主键。只要确保它也被编入索引并且你是金色的。如果Foo.code实际上是唯一的,那么你甚至可以摆脱Foo.id并节省一些空间。

答案 1 :(得分:2)

如果你真的使用另一个密钥作为主键,你有什么理由保持自动递增id

默认情况下,表将在主键上排序。默认情况下,按code排序可能更有意义。此外,它还需要更多的数据存储,并且由于两个索引都必须更新,因此更新速度会慢一些。对于许多应用程序而言,性能差异会产生很小的实际差异,但如果您不使用它,我就无法想到保持自动增量ID的原因。

代理主键确实有它们的用途,但是如果你已经有一个你想要用作主键的唯一列,那么使用那个唯一的列作为你的PK而不是糟糕的设计。

答案 2 :(得分:0)

取决于您打算如何查询:

  • 如果您经常需要确定与给定code相关联的Bar,则直接在FK中引用它从<{1}}迁移Foo 1}},允许你这样做没有一个JOIN。
  • 但是,如果您还需要提取BarFoo.name,那么JOIN是不可避免的,并且引用Foo.descption可以避免支付双重查找价格caused by the MySQL/InnoDB clustering

话虽如此,您可以remove the surrogate key Foo.id,消除整个困境。