举个例子, 我有3张桌子:
School: ID int, Name varchar
Student: ID int, Name varchar
StudentInSchool: StudentID int, SchoolID int
现在的问题是我是否应该在StudentInSchool表中为其添加一个主键ID int
?如果是,为什么?
它对索引有帮助吗?
任何帮助表示感谢。
答案 0 :(得分:7)
就个人而言,我在junction tables上创建了复合PK(StudentID
和SchoolID
)。这也确保了独特性。
但是,如果不需要唯一性,则必须添加ID
列以唯一标识每一行。
一般来说,添加单独的ID
列无济于事:很少有查询(如果有的话)实际使用此列。至于性能,你可以为每一列创建单独的索引,你就可以了。
答案 1 :(得分:1)
在StudentID, SchoolID
上创建主键,在SchoolID
上创建辅助索引,反之亦然,具体取决于更频繁使用的搜索条件。
如果您的表格是由索引组织的(ORGANIZATION INDEX
在Oracle中,CLUSTERED
在SQL Server
中,InnoDB
在MySQL
中),则二级索引将具有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放在那里。
如第一句所述 - 正确答案是:“我们不知道”因为缺少申请的要求和背景。