我们可以将M2M关系的PK用于另一个M2M表吗?

时间:2014-07-13 23:27:40

标签: mysql sql foreign-keys many-to-many relational-database

我有一些像这样的表:

  1. 批次(id,name)
  2. terms(id,name)
  3. 科目(身份证,姓名)
  4. 批次与名为batches_x_terms的表中的术语具有多对多的关系。

    我想创建一个表来为多个术语分配主题,这些主题也可以从批量中追溯,所以我想创建一个这样的表:

    batches_x_terms_x_subjects(id,batch_id,term_id,subject_id)

    但是进一步思考后我得出结论,我会在这个表中有很多行,以减少数据和数据冗余。

    所以我想知道我是否可以在M2M关系中使用M2M表的PK作为FK:

    ' batches_x_terms'和'科目'

    更新1: 批次表有另一列'年' 批次将具有来自不同年份的相同批次,例如

    1. ' Science',2010
    2. ' Science',2011
    3. 现在,假设每个批次都有4个学期(学期),并且在每个学期他们有不同的科目,但有些科目在这两个批次之间是共同的,对吗?

      如果我关注' batches_x_terms'和' batches_x_subjects'然后,我无法确定在特定学期中教授哪个学科的学科。我需要像这样对我的数据进行分类:

      1. 批次有多少条款?
      2. 在特定术语中将哪些科目分配给哪个批次。
      3. 可以在其他术语中将相同的主题分配给另一个批次。
      4. 此外,我有一个限制,我不能为每个批次分配不同的术语ID,对于一个学期,每个批次都有一个共同的术语ID。

        我希望这些细节很有用。

1 个答案:

答案 0 :(得分:1)

声明一个列集,其子行值是唯一的,但不包含任何较小的列集,其子行值唯一为UNIQUE NOT NULL。 (当NOT NULL合适时,我将自己限制为。)您可以将每个表的一个这样的集合定义为PRIMARY KEY。 (这相当于UNIQUE NOT NULL的约束。)

当列集子行值必须出现在另一个表中时,作为唯一列集的子行值,声明一个FOREIGN KEY。如果唯一列集未经过UNIQUE或PK声明,请执行此操作。

不仅" can"你声明每个PK,UNIQUE和/或FK,你应该声明每个可能的。 (有些DBMS会阻止你声明FK周期。)