使用复合键?或者总是使用代理键?

Cha*_*son 14 database-design primary-key

重复:多对多关系设计 - 交叉表设计

如果我有这些表(*=主键):

user
  id*
  name

group
  id*
  name
Run Code Online (Sandbox Code Playgroud)

这是否更好?

user_group
  user_id*
  group_id*
Run Code Online (Sandbox Code Playgroud)

或者这更好吗?

user_group
  id*
  user_id
  group_id
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 10

我总是投票给尽可能窄的键,静态(永不改变)因此我通常喜欢代理INT作为复合键的键.

如果你想从另一个表中引用复合键,你将始终必须指定几个条件 - 这有时会变得非常笨拙!

另请查看以下链接:

(当然,其他人可能会发布至少10个链接PRO自然键:-))

使用代理键没有坏处 - 去吧!:-)


Vin*_*vic 10

鉴于user_id和group_id都已经是代理键,因此保证是唯一的(给定应用程序的正确实现),添加第三个id是完全多余的.

除非你使用某种ORM(遗憾的是)通常会使复合键的处理变得更加复杂.在这种情况下,您必须使用所选ORM评估冗余成本与易开发性.


tva*_*son 10

每当我从连接表中省略代理主键时,我就会后悔.这似乎就像当我开始编写代码来管理具有代理主键的关系时非常方便.我通常遵循Active Record模式并使用ASP.NET MVC,因此您的里程可能会有所不同.在MVC世界中,只需一个id键就可以放在URL的末尾,这是非常有利的.

  • 例如,当您要删除关联时.或者,当联接表实际上具有(或获取)更多信息时 - 例如它表示事件的注册,最终获得相关的收费金额和时间戳.根据我的经验,有足够的时间我没有使用代理键,我后来不得不添加它,现在我只是总是使用它. (4认同)
  • 基本原因是在MVC中,url模式通常是/ controller/action/id.如果我不使用代理键,那么我的url最终为/ controller/action /?user_id = ...&group_id = ...,这也意味着我需要在视图中包含两个id作为隐藏输入等单个id更恰当地适合模式. (2认同)