Как мне объединить несколько таблиц в SQL, чьи объекты будут моделироваться с использованием наследования? - PullRequest
1 голос
/ 11 января 2009

Для моего университетского задания мне нужно разработать базовую систему управления заболеваниями и все для школы. Я решил смоделировать базовое наследование в виде

  • Человек -> Студент
  • Человек -> Персонал
  • Человек -> Страж

Персона (PersonID, Имя, Фамилия)

Student (StudentID (который ссылается на PersonID), ...)

Причина, по которой я решил сделать это, поскольку сначала я смоделировал это в UML, и у меня было наследство.

У меня есть другая таблица, в которой хранятся инциденты, в которых есть как StudentID, StaffID, так и GuardianID. Однако мне было интересно, как создать объединение в mysql, которое бы отображало имена всех трех унаследованных людей?

, например

Student.FirstName Student.LastName, Staff.FirstName, Staff.LastName и т.д. ...

Как бы я это сделал?

Или я делаю это совершенно неправильно?

Заранее спасибо.

http://pastebin.com/m263dd7 - Ссылка на мой DDL для таблиц.

Ответы [ 3 ]

3 голосов
/ 11 января 2009

У меня нет проблем с дизайном базы данных, который вы описали. Моделировать наследование в SQL всегда немного неудобно, но вы использовали наименее проблемное решение.

Вот ответ на ваш вопрос о получении имен студента и сотрудника для данного инцидента:

SELECT ps.FirstName, ps.LastName, pf.FirstName, pf.LastName
FROM Incidents i
 JOIN Students s USING (student_id)
 JOIN Persons ps ON (s.student_id = ps.person_id)
 JOIN Staff f USING (staff_id)
 JOIN Persons pf ON (f.staff_id = pf.person_id)
WHERE i.incident_id = ?;

Я предполагаю, что таблица Incidents содержит столбцы, такие как:

CREATE TABLE Incidents (
  incident_id SERIAL PRIMARY KEY,
  student_id  INT NOT NULL,
  staff_id    INT NOT NULL,
  FOREIGN KEY (student_id) REFERENCES Students(student_id),
  FOREIGN KEY (staff_id) REFERENCES Staff(staff_id)
);

Реально, я бы ожидал, что между инцидентами и каждым сотрудником и студентами будут какие-то отношения «многие ко многим». В противном случае в инциденте может участвовать только один студент и один сотрудник?

1 голос
/ 11 января 2009

Это не правильно. У вас должен быть класс Person, и другие классы определят, что определенное лицо является студентом, сотрудником и т. Д. Что произойдет, если у вас есть сотрудник, который также является студентом? Что будет, если студент закончит обучение?

Это классический пример несоответствия импеданса между реляционной моделью и моделью ОО.

Вы можете иметь, например, три таблицы:

PERSON
PersonId Фамилия FirstName

СТУДЕНТ Студенческий билет PersonId

ПЕРСОНАЛ
StaffId PersonId

0 голосов
/ 11 января 2009

Я не знаю, каково реальное использование, но не стоит использовать наследование только для повторного использования.

На первый взгляд, наличие Person класса в системе управления университетом (что-то похожее) кажется неправильным.

Было бы лучше, если бы вы упомянули цель / цель задания - что предполагается делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...