2009-01-10 6 views
1

Pour mon travail universitaire, je dois concevoir un système de gestion de base pour les maladies et tous pour une école. J'ai décidé de modéliser une base héritage sous forme deComment joindre plusieurs tables dans SQL dont les objets seront modélisés en utilisant l'héritage?

  • Personne -> Étudiant
  • Personne -> Personnel
  • Personne -> Guardian

Personne (PersonID, FirstName , LastName)

étudiants (StudentID (qui fait référence à la PersonID), ...)

la raison i J'ai décidé de le faire car j'ai modélisé cela en UML et j'ai hérité de ça.

J'ai une autre table qui a stocké les incidents qui ont à la fois StudentID, StaffID et GuardianID. Cependant je me demandais comment je pourrais créer une jointure dans mysql qui afficherait les trois noms des personnes héritées?

par exemple.

Student.FirstName Student.LastName, Staff.FirstName, Staff.LastName etc ...

Comment pourrais-je faire cela? Ou est-ce que je fais cela complètement faux de cette façon?

Merci d'avance.

http://pastebin.com/m263dd7 - Lien vers mon DDL pour les tables.

+0

Attendez, donc une personne du personnel hérite d'une personne étudiante? Cela ne semble pas juste. – sammich

+0

Ahh - les nouvelles lignes ne se sont pas montrées -ils sont destinés à tous hériter de la personne – Malachi

Répondre

3

Je n'ai aucun problème avec la conception de base de données que vous avez décrite.Il est toujours un peu difficile de modéliser l'héritage en SQL, mais vous avez utilisé la solution la moins problématique.

Voici une requête pour répondre à votre question sur la récupération des noms d'un membre d'étudiants et du personnel pour un incident donné:

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

Je suppose que la table Incidents ressemble comprend des colonnes telles que:

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

De manière réaliste, je m'attendrais à une sorte de relation plusieurs-à-plusieurs entre les incidents et le personnel et les étudiants. Sinon, un incident peut concerner un seul étudiant et un membre du personnel?

+0

Merci - vos commentaires ont corrigé mon problème - Je n'ai jamais utilisé l'utilisation en ce qui concerne la création d'un JOIN. – Malachi

+0

Oui, l'utilisation est juste un raccourci, pour faire une comparaison d'égalité contre les colonnes qui ont le même nom dans les deux tables. Si les colonnes sont nommées différemment, vous devez écrire une expression explicite dans une clause ON. –

1

Ce n'est pas correct. Vous devriez avoir une classe Personne, et d'autres classes détermineraient qu'une certaine personne est un étudiant, un membre du personnel, etc. Que se passe-t-il si vous avez un employé qui est aussi étudiant? Que se passe-t-il si l'étudiant obtient son diplôme?

Il s'agit d'un exemple classique de discordance d'impédance entre le modèle relationnel et le modèle OO.

Vous pourriez avoir par exemple trois tables:

PERSONNE
personID LastName FirstName

ÉLÈVE StudentID personID

PERSONNEL
StaffID personID

+0

Désolé - j'ai mal formaté et n'a pas remarqué quand j'ai soumis. – Malachi

+0

Que suggérez-vous que je fais quand je modélise ce genre de données? – Malachi

+0

Alors la modélisation sans PersonID dans la classe Inherited serait-elle une mauvaise idée? – Malachi

0

Je ne sais pas ce que l'utilisation réelle, mais ce n'est pas une bonne idée d'utiliser l'héritage juste pour la réutilisabilité. A première vue, avoir une classe Person dans un système de gestion universitaire (quelque chose de similaire) ne semble pas correct.

Il vaudrait mieux que vous mentionniez l'objectif/le but de la mission - ce que vous êtes censé faire.

+0

modifié la question, merci – Malachi

Questions connexes