sql-server-2008-r2 - 子表的主键是否正确?

标签 sql-server-2008-r2 primary-key query-performance

员工表中的主键应该是什么?

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/

相关文章:

sql - 将行插入仅包含主键字段的表

mysql - 这是真的吗 : "In MySQL, fetching a column value forces a read of the entire row"?

javascript - 如何组合两个点击功能?

sql-server - 基于公司 ID 的逗号分隔名称

Mysql 索引不适用于更高的限制

sql - select中子查询语句的where子句

mysql - 在数据库书架中创建表,其中一本书可以有多个类别

mysql - 加快 MySQL LEFT JOIN 速度的建议

sql - SQL Server 2008 基于 Web 的表单

sql-server-2008-r2 - CDC 同一身份值的多次插入/删除