2017-07-29 46 views
1

我有一个有点独特的情况在这里,我有3个型号:Degree,StudentConsultant创建属于许多关系,超过2个模型envolved

学生和顾问之间有多对多的关系。
此外,学位和学生之间还有多对多的关系。

我可以为上述关系中的每一个设置2个数据透视表,
但是这里重要的是:一个具体学位的学生可以有1位顾问。
换句话说,创建2个单独的数据透视表,并不能告诉我哪位顾问对于特定用户的程度如何。

在这里我可以想到的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,但无法满足我的要求。

回答

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暗示有c只有一个记录与给定的(degree_id, student_id)对,所以consultant_id是每对单值。规范化正好告诉我们这些表没有问题可以解决。

你必须在逻辑上权衡表的数量,ID的数量,空表的含义& simplcity /复杂性(谓词),与其他事物的物理性能一起。典型的SQL设计将使用1st。您需要查找&关注信息建模&关系数据库设计。 (PS根本不是“独特的情况”。)

相关问题