У меня нет проблем с дизайном базы данных, который вы описали. Моделировать наследование в 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)
);
Реально, я бы ожидал, что между инцидентами и каждым сотрудником и студентами будут какие-то отношения «многие ко многим». В противном случае в инциденте может участвовать только один студент и один сотрудник?