我应该在这里使用主键吗?

时间:2010-01-22 10:25:09

标签: sql database database-design

举个例子, 我有3张桌子:

School: ID int, Name varchar

Student: ID int, Name varchar

StudentInSchool: StudentID int, SchoolID int

现在的问题是我是否应该在StudentInSchool表中为其添加一个主键ID int?如果是,为什么?

它对索引有帮助吗?

任何帮助表示感谢。

7 个答案:

答案 0 :(得分:7)

就个人而言,我在junction tables上创建了复合PK(StudentIDSchoolID)。这也确保了独特性。

但是,如果不需要唯一性,则必须添加ID列以唯一标识每一行。

一般来说,添加单独的ID列无济于事:很少有查询(如果有的话)实际使用此列。至于性能,你可以为每一列创建单独的索引,你就可以了。

答案 1 :(得分:1)

StudentID, SchoolID上创建主键,在SchoolID上创建辅助索引,反之亦然,具体取决于更频繁使用的搜索条件。

如果您的表格是由索引组织的(ORGANIZATION INDEX在Oracle中,CLUSTEREDSQL Server中,InnoDBMySQL中),则二级索引将具有PRIMARY KEY作为最左边的部分,因此,所有信息都可以从索引中获取。

答案 2 :(得分:0)

答案是,这取决于。在大多数情况下,答案是“否”:(StudentID, SchoolID)的复合主键就足够了。

但是,如果该交叉表开始获取其他相关数据(例如,加入日期,离开日期)和/或它成为相关表的父级(例如出勤记录),那么您可能想要或需要将其视为常规表。在这种情况下,(StudentID, SchoolID)成为业务密钥(即仍然是唯一的),并添加Id或其他任何合成(或代理)主键。

答案 3 :(得分:0)

在纯数据完整性方面:没有。将主键定义为(StudentID,SchoolID)就足够了。

但是,您没有说明您使用的是哪种RDBMS。可能是,对于其中一些,单个ID列将导致更有效的查询计划。

对于SQL Server,两个整数的复合主键非常有效,并且两列上不需要其他索引。

答案 4 :(得分:0)

在此示例中,除非StudentInSchool表具有其他属性,例如当学生在那所学校应对动作的时间戳时,我不会使用它,我会将schoolID字段放在Student表中并将其定义为外键。

但如果这是设计,那么是的,你不会通过在StudentInSchool表上放置主键来丢失任何东西。

答案 5 :(得分:0)

您可以将StudentID和SchoolID合并为一个主键。

  

有一些一般规则   描述何时使用索引。什么时候   处理相对较小的桌子,   索引不会提高性能。在   一般指标可提高绩效   何时在使用的字段上创建它们   在表连接中。最多使用索引   您的数据库查询检索   相对较小的数据集,因为如果   您的查询将检索大部分数据   大部分时间,索引都会   实际上减慢了数据检索速度使用   具有多个列的索引   不同的价值观(没有多少   列中的重复值)。   虽然索引改进了搜索   性能,他们减缓更新,   这可能是值得的   考虑

来源:SQL Indexes

答案 6 :(得分:0)

好的我觉得作业中缺少一些东西,所以我会尝试用我对现实世界的不了解:o)

学生是什么?他们去上学,他们可能在不止一所学校(特别是大学)学习,甚至可能会在同一所学校上学等等。

联结表是否足够(对两个ID都有PK)足以模拟这些关系吗?

简短回答:没有

答案很长:仍然没有,但对于简单案例的子集就足够了(你的其中一个是吗?)。

如果您希望稍后针对所有这些情况扩展db,则需要代理PK(您的ID)。如果我怀疑它可能是必需的(因为没有太多损失),我会把ID放在那里。

如第一句所述 - 正确答案是:“我们不知道”因为缺少申请的要求和背景。