在这种情况下,如何转换ER模型中的(0,N)(0,N)(0,N)三元关系?

时间:2018-08-01 18:45:55

标签: database postgresql database-design entity-relationship relational-model

假设作为实体: 家庭作业, 学生, 答案

和约束(请仔细查看约束1):

    1)A STUDENT can give only 1 ANSWER for the same HOMEWORK
    2) A HOMEWORK can be solved by (0,N) STUDENT each giving their answer
    3)AN ANSWER can be submitted by (0,N) STUDENT 
    4)(Obviously it is possible to give the same answer
for different HOMEWORK 
and that different STUDENT can give the same answer for the same HOMEWORK)

示例:

HOMEWORK STUDENT ANSWER
 XXX       A        1
 XXX       B        1
 XXX       C        2
 YYY       B        1
 YYY       C        1
 ZZZ       A        3
 ZZZ       C        1

注意学生不可能为同一作业提交2个解决方案。  因此,不允许插入XXX A 2行

我会用三元关系来建模:

    STUDENT---------(0,N) <DO>(0,N)---------HOMEWORK
                           (0,N)
                            |
                            |
                          ANSWER

但是随后使用通常的翻译算法将其翻译为关系模型:

-- -- means FOREIGN KEY 
 _____ means PRIMARY KEY

 DO(HOMEWORK,STUDENT,ANSWER) 
    -- -- -- -- -- -- -- -- 
    _______________________ 
 HOMEWORK(with his attributes)
 STUDENT(with his attributes)
 ANSWER(with his attributes)

由于ANSWER是主键的一部分,所以这意味着学生可以解决相同的作业,并提交不同的答案; 这违反了期望的约束条件。

可能我会解决这个问题:

1)-transforming the ternary relationship DO in a binary relationship and adding an attribute ANSWER to DO
-then create a trigger to check that the value of answer in DO is a possible answer.

Or 

2)Keep ternary relationship but use another trigger

但是我想知道您的意见(例如,如果您要在ER中以其他方式对这个问题进行建模)。

PS-我使用的是Postgres

1 个答案:

答案 0 :(得分:2)

如果我正确地理解了规范,我认为可以通过简单地在表上引入表示三元关系的约束来对您的问题进行建模,而无需使用触发器。

让我们以以下方式定义它(属性“ fkT”代表表T的外键):

ProposedSolution (fkAnswer, fkHomework, fkStudent)
  primary key (fkAnswer, fkHomework, fkStudent),
  unique (fkHomework, fkStudent)

请注意,主键约束使学生,答案和作业的组合变得独特,同时允许这样的事实,例如,不同的学生可以给出相同的解决方案(即对相同作业的答案相同),或者该学生可以针对不同的作业给出相同的答案。

还有待约束的是约束1:即学生不能对同一作业给出多个答案。但这是通过独特的约束条件解决的,该约束条件确保表中不能有两个元组的学生和作业价值相同。