倍数为1列的外键

时间:2016-08-23 19:00:46

标签: mysql sql database constraints foreign-key-relationship

我有这个问题:

我有一个“学校”数据库,需要使用Subject表引用Teachers表。

教师将指导多个科目。这就是问题所在。

教师表:

  • id_Teacher < - PK
  • id_Subject
  • id_Course
  • 名称
  • 地址

主题表:

  • id_Subject < - PK
  • 名称

我总是在外键上使用1个值。例如:

SELECT * FROM Teachers WHERE id_Subject = 1

但现在我真的不知道自己要做什么。

3 个答案:

答案 0 :(得分:0)

你说“教师会指导不止一个主题。”据我所知,老师可以指导多个科目。那么,教师拥有id_Subject是错误的,因为这意味着教师只能教一门科目。

如果您使主题包含id_Teacher,则每个主题将引用教师,因此可以使多个主题具有相同的教师。这就像说一位老师会教授多个科目一样。

另一方面,如果你不仅需要一个教授多个科目的教师,而且还需要一个由多个教师教授的科目(多对多的关系),那么显然,你不能放{{1在主题中,因为这迫使一个主题仅由一位教师教授。在这种情况下,您的教师行既不能拥有id_Subject,也不能让您的主题行拥有id_Teacher。相反,你需要一个额外的表,比如说“TeachersSubjects”,其中每一行都有id_Teacherid_Subject,基本上列出了教师和科目的所有可能组合。

答案 1 :(得分:0)

我认为这是多对多关系,教师可以有多个科目,科目可以有多个教师,你需要额外的表格。

答案 2 :(得分:0)

我认为你想要描述的内容被称为“多对多”的关系。它需要一个中间表来连接实体表,在许多情况下,中间表本身就成了一个商业实体。

考虑例如:

Teachers
----------
ID
Name
etc.

Subjects
----------
ID
Name
etc.

TeacherSubjects
----------
ID
TeacherID (FK to Teachers)
SubjectID (FK to Subjects)

TeachersSubjects之间的关系本身就成了潜在存储数据的地方。考虑主题领域(学校),TeacherSubjects表听起来好像是Classes表等待发生。您可以在哪里放置有关类的给定实例的信息,该类是具有教师和主题的业务实体。