复合主键?还是具有唯一复合索引的自动递增主键?

Composite primary key? Or an auto increment primary key with unique composite index?

我有两个名为 StudentCourse 的 table 和一个名为 [=31] 的连接 table =]学生课程。 StudentCourse 都有一个自动递增整数 Id.

StudentCourse table 最多有 10,000 条记录(不能更多!),我将使用这个 table 来获取 select 一些数据在大多数情况下。 插入性能现在不是我关心的,我只想快速获取数据!

我的查询形式为:

select * from studentcourse where studentid == sid and courseid == cid
select * from studentcourse where studentid == sid

下面哪个实现更好?为什么?它总是比另一个好还是取决于它? 我的senario还有更好的解决方案吗?

1:使用StudentCourse的自动递增Id列作为主键并设置一个独特的复合索引,如 (StudentId, CourseId).

2:使用复合主键,如 (StudentId, CourseId)

3:创建没有主键的 table,只使用唯一的复合索引,如 (StudentId, CourseId) .


更新

如果我们有一些只有在我们有关系时才重要的其他属性怎么办!将 ScoreGrade 视为 StudentCourse table 中的第 3 列。在这种情况下我们应该使用第一个选项吗?我的意思是假设我们正在使用 ORM,我们应该在我们的 Student class(实体)。

前两个选项没问题。重要的部分是在 (studentid, courseid) 上有一个唯一索引。唯一性保证了数据的完整性(同一个学生不能重复上同一门课),索引提高了查找效率。

是否应该使用代理主键还有待讨论。如果您需要以某种方式唯一标识每条记录(例如:从另一个 table 引用 table,例如),single-column 主键可能会派上用场。

我不推荐第三个选项,因为它不强制完整性约束。

最后:在大多数数据库中,索引中键的顺序很重要。对于您显示的两个查询,您希望 studentid 位于索引的第一个位置,因此仅在此列上过滤的查询仍然可以使索引受益。

2最好。

它比1好,因为它少了一个索引(所以少了space/cache并且索引维护更便宜)。代理键(如 Id)在联结 table.

中通常无用

它可能比 3 更好,具体取决于您的 DBMS:某些 DBMS 不允许您在唯一索引上 cluster table(只是在主键上)1。即使在允许它的 DBMS 上(如 SQL 服务器),我也会选择 1 以更直接和更简单的语法。


1 有些不允许您从 FOREIGN KEY 引用唯一索引(只是 PRIMARY KEY 或 UNIQUE 约束),尽管这可能不相关这里。如果是,那么您会考虑代理键 Id.