创建属于多个关系,包含2个以上的模型

时间:2017-07-29 06:02:05

标签: mysql database laravel foreign-keys

我有一个独特的情况,我有3个模型:DegreeStudentConsultant

学生和顾问之间存在多对多的关系 学位与学生之间也有很多很多相关内容。

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

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

第一个是创建一个包含3个外键的数据透视表,如:

student_id  |  degree_id  |  consultant_id
通过这种方式,我可以知道谁是该学生的特定学位顾问。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

  

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

你的第一个设计并没有强制执行。 student_id可能与degree_student的student_id不同。 degree_student_id可能有多个consultant_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设计将使用1st。你需要找到&遵循已发布的信息建模参考资料关系数据库设计。 (PS根本不是"独特的情况"。)