Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 数据库分析连接表_Database_Database Design_Primary Key_Composite Primary Key_Junction Table - Fatal编程技术网

Database 数据库分析连接表

Database 数据库分析连接表,database,database-design,primary-key,composite-primary-key,junction-table,Database,Database Design,Primary Key,Composite Primary Key,Junction Table,这件事让我很困惑, 我有一个大学信息系统学生表和科目(课程)表之间的连接表,主键是复合键(StudentID,SubjectID),两者都是外键,但学生可能考试不及格,重复科目,因此我们将有重复的PK,我们需要记录所有数据。我有两种方法来解决这件事,但我不知道最好的方法是什么 添加新列作为主键而不是复合键 加入“组合键季节”列和“年份”列,组合键将是(StudentID、SubjectID、Season、year)。我必须提到,我不需要这个复合键作为外键 哪种方法对性能和数据库完整性更有利?科目

这件事让我很困惑, 我有一个大学信息系统学生表和科目(课程)表之间的连接表,主键是复合键(StudentID,SubjectID),两者都是外键,但学生可能考试不及格,重复科目,因此我们将有重复的PK,我们需要记录所有数据。我有两种方法来解决这件事,但我不知道最好的方法是什么

  • 添加新列作为主键而不是复合键
  • 加入“组合键季节”列和“年份”列,组合键将是(StudentID、SubjectID、Season、year)。我必须提到,我不需要这个复合键作为外键

  • 哪种方法对性能和数据库完整性更有利?

    科目和考试是独立的(如果相关)概念,因此您不应尝试在同一个表中表示它们。此外,为给定科目举行考试的事实与任何特定学生参加该考试的事实是分开的。将所有这些概念拆分为各自的表,模型就会变得更自然,例如:

    表示多次参加同一考试的学生只需在student_考试表中添加多行即可


    注:STUDENT_SUBJECT只记录学生注册该科目的事实,但不记录注册时间(哪一年/哪一学期)。保存学期特定信息可能需要在模型中添加更多的表和更复杂的关系


    注意:此模型中存在菱形依赖项。由于科目ID是从“顶部”(科目)向下“两侧”(学生科目、考试)传递,然后合并到菱形的“底部”(学生考试),因此学生不能参加他没有注册的科目的考试。

    我没有提到这一点,这是个好办法,但我要求的主要概念是关于复合键的,我理解它是可以的。非常感谢