【发布时间】:2020-10-28 09:58:00
【问题描述】:
我有两个名为 Student 和 Course 的表以及一个名为 StudentCourse 的连接表。 Student 和 Course 都有一个自动递增整数 Id。
StudentCourse 表最多有 10,000 条记录(不会更多!),我将在大多数情况下使用此表来选择一些数据。 插入性能现在不是我关心的问题,我只想快速获取数据!
我的查询形式为:
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:创建没有主键的表,只使用像 (StudentId, CourseId) 这样的唯一复合索引。
更新
如果我们有一些仅在我们有关系时才重要的其他属性怎么办!将Score 或Grade 视为StudentCourse 表中的第三列。在这种情况下我们应该使用第一个选项吗?我的意思是假设我们正在使用 ORM,并且我们应该在我们的 Student 类(实体)中有对 StudentCourse 类(实体)的引用。
【问题讨论】:
-
就像下面的两个答案一样,我会选择#2。请记住,索引按适当的列对数据进行排序,因此对于聚集索引(通常默认情况下带有主键),您通常希望第一列是您最常过滤的列。但是,在这样的表上,我经常也有一个相反顺序的非聚集索引(例如,
CourseId, StudentID),所以如果你从其他方式进行查询(例如,哪些学生在 CourseID 421 中?)它还有一个可以使用的索引。 -
更新后:这里的关键部分是聚集索引在您需要时为您提供帮助。默认情况下,某些数据库(例如 SQL Server)使您的聚集索引与 PK 相同。如果需要(例如,选项 1),您可以使用与 PK 不同的聚集索引,特别是如果您可以在需要的聚集索引中有重复项。在
StudentID, CourseID上使用聚集索引的优势在于,它有助于查找特定学生或一组学生的课程记录。建议brentozar.com/training/think-like-sql-server-engine - 它真的帮助了我。
标签: sql database-design query-optimization where-clause unique-key