Как перевести (0, N) (0, N) (0, N) тройную связь в модель ER в этой ситуации?

Допустим как сущности: ДОМАШНЕЕ ЗАДАНИЕ, СТУДЕНТ, ОТВЕТ

и ограничения (внимательно посмотрите ограничение 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)

Поскольку ОТВЕТ является частью первичного ключа, это означает, что учащийся может решить одно и то же домашнее задание, отправив разные ответы; это нарушает желаемые ограничения.

Наверное, я бы решил это:

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


person Andrea Colo    schedule 01.08.2018    source источник


Ответы (1)


Если я правильно понял спецификации, я думаю, что вашу проблему можно смоделировать без использования триггеров, просто введя ограничение на таблицу, представляющую троичное отношение.

Определим его следующим образом (атрибуты «fkT» обозначают внешний ключ для таблицы T):

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

Обратите внимание, что ограничение первичного ключа делает уникальной комбинацию учащегося, ответа и домашнего задания, при этом допуская тот факт, что, например, разные учащиеся могут давать одинаковые решения (то есть один и тот же ответ на одно и то же домашнее задание) или что учащиеся могут давать один и тот же ответ для разных домашних заданий.

Остается выполнить ограничение 1: ученик не может давать несколько ответов на одно и то же домашнее задание. Но это решается уникальным ограничением, гарантирующим, что в таблице не может быть двух кортежей с одинаковым значением студента и домашнего задания.

person Renzo    schedule 02.08.2018