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

复合主键?
EN

Stack Overflow用户
提问于 2011-01-19 23:35:20
回答 4查看 21.4K关注 0票数 23

这就是让我困惑的地方。我经常在数据库表中使用复合主键。这种方法的缺点是,当我删除或编辑条目时,我有相当多的额外工作。但是,我觉得这种方法符合数据库设计的精神。

另一方面,我的一些朋友从不使用组合键,而是在表中引入另一个'id‘列,所有其他键都是FK。在编写删除和编辑过程时,他们的工作量要少得多。但是,我不知道它们如何保持数据条目的唯一性。

例如:

方式1

代码语言:javascript
复制
create table ProxUsingDept (
    fkProx int references Prox(ProxID) NOT NULL,    
    fkDept int references Department(DeptID) NOT NULL,    
    Value int,    
    PRIMARY KEY(fkProx,fkDept)
)

方式2

代码语言:javascript
复制
create table ProxUsingDept (
        ID int NOT NULL IDENTITY PRIMARY KEY
        fkProx int references Prox(ProxID) NOT NULL,    
        fkDept int references Department(DeptID) NOT NULL,    
        Value int
)

哪种方式更好?使用第二种方法的坏处是什么?有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-19 23:54:28

我个人更喜欢你的第二种方法(并且几乎100%的时间都会使用它)-引入一个 ID字段。

为什么?

  • 使任何引用您的表的表的工作变得容易得多-连接条件简单得多,只有一个ID列(而不是您需要一直连接的2、3或更多列)
  • 使工作变得容易得多,因为任何引用您的表的表只需要携带一个ID作为外键字段-而不是来自复合键的多个列
  • 使工作变得更容易,因为数据库可以处理唯一<ID>d12列的创建

但是,我不知道它们如何保持数据条目的唯一性。

非常简单:在复合列上放置一个唯一的索引,否则将用作主键!

代码语言:javascript
复制
CREATE UNIQUE INDEX UIX_WhateverNameYouWant 
   ON dbo.ProxUsingDept(fkProx, fkDept)

现在,你的表保证你的表中永远不会有一对重复的(fkProx, fkDept) -问题解决了!

票数 29
EN

Stack Overflow用户

发布于 2011-01-19 23:57:07

您可以提出以下问题:

但是,我不知道它们如何保持数据条目的唯一性。

可以通过在列上声明单独的复合唯一索引来保持唯一性,否则这些列将形成自然主键。

哪种方法更好?

不同的人有不同的观点,有时甚至持有强烈的观点。我想你会发现越来越多的人使用代理整数键(这并不是说它是“正确”的解决方案)。

使用第二种方法的坏处是什么?

以下是使用代理键的一些缺点:

  1. 您需要一个附加索引来维护自然主键的唯一性。
  2. 在选择数据以获得所需结果时,您有时需要附加联接(当您仅使用复合自然键中的列就可以满足查询要求时,就会发生这种情况;在这种情况下,您可以使用外键列,而不是使用JOINing返回原始表)。
票数 18
EN

Stack Overflow用户

发布于 2011-01-19 23:55:25

在像M:N连接表这样的情况下,组合键最有意义(如果性质或M:N链接发生变化,您无论如何都必须修改这个表)。

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

https://stackoverflow.com/questions/4737190

复制
相关文章

相似问题

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