【问题标题】:Create a belongs to many relationship with more than 2 models envolved创建一个涉及多于 2 个模型的属于多个关系
【发布时间】:2018-01-05 06:06:26
【问题描述】:

我在这里有一个特殊的情况,我有 3 个模型:DegreeStudentConsultant

学生和顾问之间存在多对多关系。
学位和学生之间也存在多对多关系。

对于上述关系中的每一个,我可以有 2 个数据透视表,
但这里重要的是:一个特定学位的学生可以有一名顾问。
换句话说,创建 2 个单独的数据透视表,并没有给我哪个顾问对于特定用户的程度的信息。

我可以在这里想到 2 个解决方案:

第一个是创建一个带有 3 个外键的数据透视表,例如:

student_id  |  degree_id  |  consultant_id

这样我就可以知道谁是学生特定学位的顾问。

但是这种方式是构建数据库的标准方式吗?
另外,我应该为此创建一个 Pivot 模型吗?
代码 sn-p 会是什么样子?

我能想到的另一种方法是创建 2 个单独的数据透视表,并在另一个数据透视表中引用 id
所以这看起来像:
学位学生:student_id | degree_id
顾问学生:student_id | consultant_id | **degree_student_id**

再次,这是一种标准方法吗?
我应该为此创建一个 Pivot 模型吗?

对于最后的讨论,我会接受任何其他更好(/标准)的解决方案建议。

注意:我检查了herehere,但无法满足我的要求。

【问题讨论】:

    标签: mysql database laravel foreign-keys


    【解决方案1】:

    一个特定学位的学生可以有一名顾问

    您的第一个设计并未强制执行此操作。 student_id 可能与 degree_student 的 student_id 不同。一个 degree_student_id 可能有多个 advisor_id。此外,consultant_id 必须可以为空。

    类似于您的第一个设计:

    --     student student_id is in degree degree_id witout a consultant  
    -- AND consultant_id IS NULL  
    -- OR  student student_id is in degree degree_id with consultant consultant_id  
    consultant_degree_student: degree_id  |  student_id  |  consultant_id  
    (composite) PK (primary key) (degree_id, student_id)  
    nullable consultant_id  
    

    类似于您的第二个设计(具有隐式 degree_student_id 字段):

    -- degree_student_id identifies student student_id being in degree  degree_id  
    degree_student: degree_student_id  |  degree_id  |  student_id  
    
    --     degree_student_id identifies student student_id being in degree degree_id  
    -- AND student student_id is in degree degree_id with consultant consultant_id  
    degree_student_consultant: degree_student_id  |  consultant_id  
    

    类似于那些没有额外的 id 和没有可为空的字段:

    -- student student_id is in degree degree_id  
    degree_student: degree_id  |  student_id  
    
    -- student student_id is in degree degree_id with consultant consultant_id
    consultant_degree_student: degree_id  |  student_id  |  consultant_id  
    PK (primary key) (degree_id, student_id)  
    

    复合 PK 意味着给定的 (degree_id, student_id) 对只能有一条记录,因此 consultant_id 是每对单值的。规范化恰好告诉我们这些表没有它可以解决的问题。

    您必须在逻辑上权衡表的数量、id 的数量、空值和表含义的简单性/复杂性(谓词),以及其他物理性能。典型的 SQL 设计将使用第一个。您需要查找并遵循已发布的信息建模和关系数据库设计参考。 (PS 根本不是“独特情况”。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      相关资源
      最近更新 更多