2010-09-27 7 views
3

J'ai une base de données qui a différentes notes par cours (c'est-à-dire trois devoirs pour le cours 1, deux devoirs pour le cours 2, ..., cours N avec devoirs M). Comment dois-je gérer cela dans la mesure où la conception de base de données va?Tables dynamiques?

CourseID HW1 HW2 HW3 
    1 100 99 100 
    2 100 75 NULL 

EDIT Je suppose que je dois reformuler ma question. En ce moment, j'ai deux tables, Cours et Devoirs. Les devoirs permettent de suivre une clé étrangère. Ma question est comment puis-je savoir combien de devoirs seront disponibles pour chaque cours?

Répondre

0

Décomposer la table en trois tables différentes. L'un tient les cours, le second les devoirs et le troisième les connecte et stocke le résultat.

Cours:

CourseID CourseName 
1  Foo 

devoirs:

HomeworkID HomeworkName HomeworkDescription 
HW1  Bar   ... 

Résultat:

CourseID HomeworkID Result 
1  HW1  100 
+0

downvoted parce que le modèle proposé a devoirs et cours comme des entités indépendantes - tout devoirs peuvent demander à tout cours . Comme Homework dépend fonctionnellement de Course, 'CourseID' devrait être une colonne de clé étrangère dans' Homework' référençant la table 'Course', et la troisième table devrait être éliminée. –

2

Non, ce n'est pas un bon design. C'est un antipattern que je calledMetadata Tribbles. Vous devez continuer à ajouter de nouvelles colonnes pour chaque devoir, et ils se propagent hors de contrôle.

C'est un exemple de répétant les groupes, qui viole le First Normal Form de la conception de base de données relationnelle.

Au lieu de cela, vous devez créer une table pour Courses, et une autre table pour Homeworks. Chaque ligne dans Homeworks référence une ligne parente dans les cours.

Ma question est comment puis-je savoir combien de devoirs seront disponibles pour chaque cours?

Vous souhaitez ajouter des lignes pour chaque travail à domicile, alors vous pouvez les compter comme suit:

SELECT CourseId, COUNT(*) AS Num_HW_Per_Course 
FROM Homeworks 
GROUP BY CourseId 

Bien sûr, cela ne compte que les après HomeWorks vous avez rempli la table avec des lignes. Donc vous (ou les concepteurs de cours) devez faire cela.