Domanda

Per il mio incarico universitario devo progettare un sistema di gestione di base per le malattie e tutto per una scuola. Ho deciso di modellare alcune eredità di base sotto forma di

  • Persona - > Studente
  • Persona - > Il personale
  • Persona - > Guardiano

Person (PersonID, FirstName, LastName)

Studente (StudentID (che fa riferimento al PersonID), ...)

Il motivo per cui ho deciso di fare questo come ho modellato questo prima in UML e ho avuto l'eredità in questo.

Ho un'altra tabella che memorizza gli incidenti che hanno sia StudentID, StaffID e GuardianID. Tuttavia mi chiedevo come avrei creato un join in mysql che mostrasse tutti e tre i nomi delle persone ereditate?

per es.

Student.FirstName Student.LastName, Staff.FirstName, Staff.LastName ecc ...

Come lo farei?

O sto facendo questo completamente sbagliato in questo modo?

Grazie in anticipo.

http://pastebin.com/m263dd7 - Link al mio DDL per le tabelle.

È stato utile?

Soluzione

Non ho problemi con il design del database che hai descritto. Modellare l'ereditarietà in SQL è sempre un po 'scomodo, ma hai usato la soluzione meno problematica.

Ecco una domanda per rispondere alla tua domanda sul recupero dei nomi di uno studente e di un membro dello staff per un dato incidente:

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 = ?;

Suppongo che l'aspetto della tabella Incidenti includa colonne come:

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)
);

Realisticamente, mi aspetterei una sorta di relazione molti-a-molti tra incidenti e ciascuno del personale e degli studenti. Altrimenti, un incidente può coinvolgere solo uno studente e un membro dello staff?

Altri suggerimenti

Questo non è giusto. Dovresti avere una classe Persona, e altre classi determinerebbero che una determinata Persona è uno Studente, Personale, ecc. Cosa succede se hai una persona personale che è anche uno studente? Cosa succede se gli studenti si diplomano?

È un classico esempio di mancata corrispondenza dell'impedenza tra il modello relazionale e il modello OO.

Potresti avere ad esempio tre tabelle:

PERSONA
PersonId Cognome FirstName

STUDENT StudentID PersonId

STAFF
StaffID PersonId

Non so quale sia il reale utilizzo, ma non è una buona idea usare l'ereditarietà solo per riusabilità.

A prima vista, avere una classe Person in un sistema di gestione universitaria (qualcosa di simile) non sembra giusto.

Sarebbe meglio menzionare l'obiettivo / lo scopo dell'incarico - cosa dovrebbe fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top