san*_*one 18 database-design composite-primary-key
这让我很困惑.我经常在数据库表中使用复合主键.这种方法的不好的一面是,当我删除或编辑条目时,我还有额外的工作.但是,我觉得这种方法符合数据库设计的精神.
另一方面,有我的朋友,他们从不使用复合键,而是在表中引入另一个"id"列,而所有其他键只是FK.在编写删除和编辑过程时,它们的工作量要少得多.但是,我不知道它们如何保留数据条目的唯一性.
例如:
方式1
create table ProxUsingDept (
fkProx int references Prox(ProxID) NOT NULL,
fkDept int references Department(DeptID) NOT NULL,
Value int,
PRIMARY KEY(fkProx,fkDept)
)
Run Code Online (Sandbox Code Playgroud)
方式2
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
)
Run Code Online (Sandbox Code Playgroud)
哪种方式更好?使用第二种方法有什么不好的方面?有什么建议?
mar*_*c_s 26
我个人更喜欢你的第二种方法(并且几乎100%都会使用它) - 介绍一个代理ID字段.
为什么?
使引用表的表更容易生活 - 只需一个ID列(而不是2,3,甚至更多列,您需要一直加入),JOIN条件更简单
使生活变得更容易,因为任何引用表的表只需要携带一个ID外键字段 - 而不是复合键中的几列
因为数据库可以处理唯一ID列的创建(使用INT IDENTITY),所以生活变得更加容易
但是,我不知道它们如何保留数据条目的唯一性.
非常简单:在复合列上放置一个UNIQUE INDEX,否则您将用作主键!
CREATE UNIQUE INDEX UIX_WhateverNameYouWant
ON dbo.ProxUsingDept(fkProx, fkDept)
Run Code Online (Sandbox Code Playgroud)
现在,你的表保证你的表中永远不会有一对重复(fkProx, fkDept)- 问题解决了!
Lar*_*tig 17
你问以下问题:
但是,我不知道它们如何保留数据条目的唯一性.
可以通过在列上声明单独的复合UNIQUE索引来保留唯一性,否则这些索引将形成自然主键.
哪种方式更好?
不同的人有不同的意见,有时坚持不懈.我想你会发现更多人使用代理整数键(而不是那使它成为"正确"的解决方案).
使用第二种方法有什么不好的方面?
以下是使用代理键的一些缺点:
您需要一个额外的索引来维护自然主键的唯一性.
在选择数据以获取所需结果时,有时需要额外的JOIN(当您只使用复合自然键中的列满足查询要求时会发生这种情况;在这种情况下,您可以使用外键列而不是JOINing回到原来的表).