2010-11-10 3 views
1

Scénario de base: J'ai des étudiants, des cours et des exigences de cours qui doivent être stockés dans la base de données.Modélisation des cours et des pré-requis dans la base de données

Quelqu'un a-t-il un aperçu de la meilleure façon de stocker ces éléments et de parcourir les prérequis?

1) Exemple simple:

  • C: Math 100, prereq: aucun
  • C: Math 150, prereq: aucun
  • C: Math 200, prereq: Math 101, Math 150

Étudiant A terminé Math 100. Comment détermine-t-on s'il est admissible à CS200 via l'interrogation de la base de données?

2) Exemple plus compliqué:

  • C: Chem 100, prereq: aucun
  • C: Chem 200, prereq: Chem 100
  • C: Chem 201, prereq: Chem 200
  • C: Chem 202, prereq: Chem 200
  • C: Chem 300, prereq: deux quelconques Chem 200, Chem 201, Chem 202

L'étudiant B a terminé Chem 100, Chem 200, Chem 203. Comment vérifiez-vous qu'il est admissible à prendre Chem 300?

Comment modéliser la hiérarchie des pré-requis dans la base de données? Tous les conseils, liens, références seraient les bienvenus.

+0

Swartz. Vous devez lire vos réponses et répondre. – PerformanceDBA

Répondre

2

Il y a peu de choses auxquelles vous n'avez pas pensé, comme dans les entités qui doivent être définies, qui sont implicites dans votre question. Permettez-moi d'en inclure quelques-uns, mais ne vous laissez pas distraire par eux, je me concentre sur votre question posée. Vous pouvez ignorer en toute sécurité Grade, Teacher, etc pour l'instant et de les contempler pour l'avenir.

Typical Data Model for a College

IDEF1X Notation, pour ceux qui ont besoin d'explication des symboles.

  • Il n'y a pas besoin d'ajouter des clés Surrogate à moins qu'ils sont nécessaires, en raison de la la clé naturelle devient trop grand pour transporter dans les enfants; Je ne les ai pas tamponnés aveuglément comme PK sur chaque table. Dans tous les cas, la considération est au niveau physique et non logique.

  • J'ai modélisé une RDb pour une université locale une fois. Je pense en plus de pré-requis tels que "deux de ...", vous pouvez avoir besoin de "et au moins un de ...", donc j'ai prévu une combinaison de ceux-ci.

  • Requisite contient la liste complète des conditions requises possibles

    • IsMandatory identifie que le Requisite est nécessaire pour remplir passe obligatoire la « au moins l'un des ... »; le reste ne sont pas, et tomber dans le « deux des ... »

    • Grade permet une note minimale à préciser que nécessaire .

  • Course.NumRequisite identifie le nombre, de la possible Requisites, qui sont nécessaires, comme dans "tout deux de ..."

Si vous avez besoin du code SQL pour naviguer dans la structure , s'il vous plaît demander.

+1

Merci pour l'information, l'affichage du code SQL aiderait grandement, en particulier la gestion des cas de "au moins un de" et "deux de". Plus précisément, j'ai une question à ce sujet, j'apprécierais beaucoup si vous pouviez y jeter un oeil (http://stackoverflow.com/questions/21519140/compound-course-prerequisites-one-or-more- de-abc-et-soit-x-ou-y-as-well-as). Merci – lberezy

0

Je pense que ce qui suit ferait plus de ce que vous voulez:

Table COURSE 
    ID_COURSE NUMBER   PRIMARY KEY 
    DESCRIPTION VARCHAR2(200) 

Table PREREQUISITE_COURSE 
    ID_COURSE   NUMBER REFERENCES COURSE.ID_COURSE 
    ID_PREREQ_COURSE NUMBER REFERENCES COURSE.ID_COURSE 
    PRIMARY KEY (ID_COURSE, ID_PREREQ_COURSE) 

Table STUDENT 
    ID_STUDENT  NUMBER PRIMARY KEY 

Table STUDENT_COURSE 
    ID_STUDENT  NUMBER REFERENCES STUDENT.ID_STUDENT 
    ID_COURSE   NUMBER REFERENCES COURSE.ID_COURSE 
    COMPLETED   CHAR(1) CHECK(IN('Y', 'N')) 
    PASSED   CHAR(1) CHECK(IS NULL OR IN ('Y', 'N')) 

Compte tenu de ce qui précède la requête pour vérifier si un étudiant a terminé avec succès tous les cours à prendre une classe donnée serait effectivement plus facile si la requête a été écrit pour retourner les cours pré-requis l'étudiant avait pas pris - quelque chose comme

SELECT c.* 
    FROM STUDENT s 
INNER JOIN COURSE STUDENT_COURSE sc 
    ON (sc.ID_STUDENT = s.ID_STUDENT) 
LEFT OUTER JOIN PREREQUISITE_COURSE pc 
    ON (pc.ID_PREREQ_COURSE = sc.ID_COURSE) 
INNER JOIN COURSE c 
    ON (c.ID_COURSE = pc.ID_COURSE) 
WHERE s.ID_STUDENT = <id of student of interest> AND 
     c.ID_COURSE = <id of course of interest> AND 
     sc.COMPLETED = 'Y' AND 
     sc.PASSED = 'Y' AND 
     pc.ID_PREREQ_COURSE IS NULL 

Notez que cela n'a pas été testé en aucune façon et peut contenir des erreurs logiques hideuses (je suis un peu méfiance de la dernière jointure de la table de cours, pour ins tance) mais cela devrait être utile pour commencer. Ou, pour citer le philosophe Pratchett

Non testé sur les animaux - vous serez le premier!

Partagez et appréciez.

Questions connexes