员工表中的主键应该是什么?
Table Stores
(PK) StoreID
{other store columns}
Table Employee
StoreID
EmployeeID
{other employee columns...}
[编辑] 我们的设置是,一名员工永远只属于一家商店。每个员工都应该有一个唯一的ID(即,即使员工属于不同的商店,他们也不应该拥有相同的ID)。
我认为 PK 应该只是 EmployeeID,因为它应该始终是唯一的。我的同事认为 PK 应该由 StoreID+EmployeeID 组合而成,但是(理论上)可能会出现重复的员工 ID。我并不完全同意他的推理,但他提到的一件事是性能。我不太担心查询性能,因为对于我们的数据库,Employee 表从未超过 5000 条记录。我们确实有其他更大的子表引用 StoreID,这是创建此类键的有效理由吗?
[编辑] 如果您还创建了一个仅对 EmployeeID 强制唯一性的内部 key ,那么复合 PK 是否可以?也许有多种方法可以做到这一点,但我想选择最被接受的做法。
最佳答案
如果您的 EmployeeID 在所有商店中都是唯一的,那么它应该是该表的主键。就像你说的,否则你会有重复的 EmployeeID。我看到 StoreID + EmployeeID 的唯一原因是每个商店都有自己的员工编号。如果一个人在两个不同的商店工作,那么他将需要两个 EmployeeID,每个商店一个。但从你的问题来看,我认为情况并非如此。
但是,假定员工始终会被分配一个 StoreID,则应该使用外键关系来设置 StoreID。
此外,如果您的同事主要关心性能,您可以向表中添加 EmployeeID、StoreID 索引,这应该可以清除任何缓慢的查询(如果您遇到任何查询)。既然你说表很小,我会等到出现性能问题后再添加索引。我认为主键始终是逻辑组织决策,我不会将性能视为该决策的一部分。
关于sql-server-2008-r2 - 子表的主键是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11036101/