Как перевести (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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам