Домашнее задание LibreOffice. Устранение избыточности. «перевод» двух внешних ключей (ни один из которых отсутствует) в один (супертип) - PullRequest
0 голосов
/ 08 апреля 2020

Я использую LibreOffice Base со встроенным HSQLDB для образовательных целей.

Предметная область - MOOC. У меня есть следующие лица: студент, учитель, пользователь (суперкласс), курс, форум, вопрос, журнал прогресса.

Для курса я хочу выделить guish, будь то студент или учитель, студенты изучите много курсов (n: m), и Учителя преподают много (n: m); но для Вопроса, в моем случае, мне не нужно никаких различий - один пользователь (либо ученик ИЛИ учитель) может задать много вопросов на форуме (1: n).

Вот картина моей таблицы отношений. Relations table for the problem

Пожалуйста, не обращайте внимания на предполагаемую избыточность атрибутов Ученик / Учитель, я должен был иметь как минимум 6 объектов.

Очевидно, что пользователь не может иметь оба ID_Student и ID_Teacher как непустые, любой из них должен быть Nan.

Как мне решить избыточность свободного пространства (Nan-s), или я должен оставить это как есть?

Или Может быть, проблема заключается в моем особом определении предметной области?

Я мог бы создать атрибут ID_user в Вопросе, который бы хранил идентификаторы ученика (1: n) и учителя (1: n), учитывая, что их идентификаторы не сталкиваются. Я был не уверен, было ли это правильно, поэтому создал отдельную сущность User.

При попытке использовать ключевое слово REFERENCES я сталкиваюсь с ошибкой: Неожиданный токен: REFERENCES в операторе [создать таблицу студентов (student_id int ссылки на первичный ключ) ]

Есть ли другой способ? Нужно ли загружать какие-либо дополнения, чтобы LibreOffice правильно их выполнял?

1 Ответ

1 голос
/ 08 апреля 2020

Внешние ключи неверны.

Пользователь - это супертип, поэтому у ученика и учителя должны быть внешние ключи:

create table users ( user_id int primary key, ... );

create table students ( student_id int primary key references users ( user_id ), ... );

create table users ( teacher_id int primary key references users ( user_id ), ... );
...