2009-11-02 29 views
1

J'essaie de comprendre la normalisation de la base de données. C'est la première fois que j'essaie de créer une base de données de travail alors pardonnez-moi pour mon ignorance. J'essaye de créer un système automatisé de contrôle de diplômé pour un projet de classe. Le tableau suivant conserve la trace de toutes les options pour une majuscule pour un nombre défini d'années de catalogue. Le tableau se présente comme suitDois-je diviser cette table en deux?

PID Title Dept Courses Must_have 

Certaines options donnent à l'utilisateur un choix d'un certain nombre de cours sur le total répertorié (d'où l'attribut Must_have). Une ligne terminée ressemblerait à ceci:

PID Title Dept Courses Must_have 
-------------------------------------------- 
1  bis  acct 201|202  NULL 

Title est le nom de l'option qui peut venir avec le major. Si bis (systèmes d'informations commerciales) avait un choix de classes, une ligne aurait un numéro dans le Must_have pour une seule ligne.

Ma question est de savoir si je dois diviser ce tableau en deux tables différentes? Je sais que la façon dont je l'ai actuellement semble un peu ... bien mal. Toute aide serait grandement appréciée.

+0

pouvez-vous donner un ex amplement pour clarifier "une rangée aurait un nombre dans le Must_have pour seulement une rangée." – akf

+0

Si une option requise 4 cours sur 15 offerts, il ressemblerait à ceci: 1 bis acct 201 | 202 4 – Piratebill

+0

Désolé, mettez bien le texte dans la section des commentaires: \ – Piratebill

Répondre

5

Je briserais dept dans une table séparée et l'associer à un identifiant numérique. Ensuite, divisez votre champ "cours" en un "tableau de jointure". Quelque chose comme ceci:

majors

Id Title  DepartmentID 

major_courses

Id MajorId  CourseId  MustHave 

départements

Id Title 

Alors que vous pouvez avoir un majeur comme:

1 bis   1 

un major_course comme:

1 1   201   0 
1 1   202   0 
1 1   203   1 -- must have 203 

puis départements comme:

1 bis 

Alors maintenant, pour obtenir une liste des cours la première majeure que vous pouvez faire ceci:

SELECT major_courses.CourseId, major_courses.MustHave, departments.Title 
FROM majors 
RIGHT JOIN major_courses ON major_courses.CourseId = majors.Id 
INNER JOIN departments ON departments.Id = majors.DepartmendID 
WHERE major.id = 1 
+0

J'ai plus des tables dans ma base de données qui devraient gérer des Majors très similaires à ce que vous avez décrit J'espérais ne pas avoir à rendre la table des options aussi compliquée, mais on dirait que c'est la meilleure façon de le faire Merci de votre aide) – Piratebill

5

Je le diviserais en trois tables. Le premier serait majors et contiendrait PID, Title, Dept, le second serait courses, contenant l'ID du cours, le nom du cours et toute autre information, et le dernier serait un mappage entre majors et cours (peut-être nommé courses_majors). La table courses_majors contiendrait l'identifiant du major, l'identifiant d'un cours et un drapeau pour montrer s'il est requis ou non par ce major.

(Cela suppose que l'on pourrait bien sûr être utilisé dans plusieurs majors)

+1

Cool, merci beaucoup, je pense que je vais diviser mes tables comme vous l'avez décrit – Piratebill

+0

@nickf - Résoudre le Many to Many semble être un grand moment pour Ahaaaa beaucoup d'entre nous –

+0

ouais, je me souviens encore quand quelqu'un m'a montré cette technique pour la première fois! – nickf

Questions connexes