两列非聚集索引组合的唯一约束

时间:2016-12-27 15:12:14

标签: sql-server database-design

我不会问如何做到这一点,但如果这是我应该做的事情。

两名员工可以从事同一份工作。当然,FK,EmployeeID和JobID都可以在" Employee_Jobs"表

让我们采取员工A,员工B,工作A和工作B.以下所有内容都可以接受:

A A
A B
B A
B B

什么是不可接受的是这两个PK的组合的副本......因为我们不能有例如[员工A在工作A上工作]两次。

那么说管理这个的唯一方法就是将两个PK,EmployeeID和JobID组合成一个唯一的非聚集索引吗?

我试着考虑如何改为将表格分解为更多表格,但我一直在回到同样的问题。

2 个答案:

答案 0 :(得分:1)

是的,不仅合适,而且事实上,这两个属性的组合应该是PRIMARY KEY。

并且在表格中由行表示的实体具有逻辑属性(由两列employeeIdJobId组成)的任何其他表中,表示员工在工作中完成的工作,(或员工对工作的贡献,或员工与工作以任何方式的关联),该表中的FK应该是复合的外键由这两列相同组成。

如果您在此表上使用代理键来简化其他表中的外键的连接和定义,那么一定要继续这样做,但要将此列中的两列自然键保留为唯一索引或备用密钥。 (密钥是密钥 - 声明或定义为唯一的任何内容),以确保此表中的数据完整性。实际上,为了向架构的用户明确说明,当出现这种情况时,我通常会将复合自然键作为PRIMARY KEY,并添加/定义代理(在联接中使用)其他表FK),作为备用键或唯一索引。这几乎只是语义上的区别,只是因为它们创建了几乎相同的功能。但是因为数据完整性对我来说比连接语法和外键结构更重要,对我来说,自然键是主键,

答案 1 :(得分:1)

是的,在这种情况下,您应该考虑将这两个字段作为主键;具体如下composite primary keycompound primary key,这将确保两个字段组合的唯一性。

primary key (EmployeeID , JobID)

虽然您说一个唯一的非聚集索引,但将该字段标记为primary key,实际上会在其上创建UNIQUE Clustered Index