首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合主键或单主键

复合主键或单主键
EN

Stack Overflow用户
提问于 2010-10-06 22:17:03
回答 2查看 2.6K关注 0票数 2

最好是拥有一个主键,还是使用复合主键(通常,它们是一个主键和一个主键的组合)。我有以下例子:

复合主键示例:

AMeta

.- AMetaId -主键

. AMetaText

BMeta

.- BMetaId -主键

AMetaID -表AMeta外键

. BMetaText

一个

.- AId -主键

AMetaId -表AMeta的主键和外键

. AText

B

.- BId -主键

BMetaId -表BMeta的主密钥外键

. AId表A的主键和外键

. BText

单主键示例:

AMeta

.- AMetaId -主键

. AMetaText

BMeta

.- BMetaId -主键

AMetaId -表AMeta外键

. BMetaText

一个

.- AId -主键

AMetaId -表AMeta外键

. AText

B

.- BId -主键

BMetaId -表BMeta外键

( AId )表A的外键

. BText

哪个是更好的数据库设计?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-07 05:11:55

我一般倾向于使用单列主键,几乎完全是--要么有一个很好的自然键可用(很少),要么我在表中添加一个代理INT标识键。

我的主要理由是:

  • 主键需要是唯一的,在任何时候都是非空的
  • 主键默认是Server中的群集键,这会增加稳定的(不改变的),窄的(最多4个字节)。最好是增加一个列主键的条件
  • 列表,我的所有外键也很容易使用单个列--我不喜欢仅仅为了使连接正常工作就必须连接3、5或更多列上的两个表,这正是如果您有复合主键

时会发生的情况。

票数 3
EN

Stack Overflow用户

发布于 2010-10-06 22:59:39

第一个方案没有任何意义,因为它暗示(并允许)表B中可以有多个行,具有相同的Bid值,但具有不同的AId值,并且没有与列出价相关联的意义。是去其他地方的FK吗?如果是的话,是为了什么?如果不是,是什么产生了它?什么意思?

另一方面,第二个方案在逻辑上是一致的,但暗示表B中的行可以与表AMeta中的两个不同行相关联,

  1. 通过表B使用FK列BMetaId,从那里到表AMeta使用TableB.AMetaId,
  2. 通过表BMeta使用列BMetaId到表BMeta,从
  3. 到AMeta使用BMEta.AMetaId

这真的是您的业务域模型的准确表示吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3877325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档