我有一个独特的情况,我有3个模型:Degree
,Student
和Consultant
。
学生和顾问之间存在多对多的关系 学位与学生之间也有很多很多相关内容。
我可以为上述关系中的每一个提供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模型吗?
对于最后的讨论,我会接受更好(/标准)的任何其他解决方案建议。
答案 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根本不是"独特的情况"。)