2010-11-09 9 views
0

Hey j'ai 3 tables appelées STUDENT, COURSE et INSCRIPTION. STUDENT a un PK de S_ID (ID d'étudiant) et COURSE a PK de C_ID (identification de cours). En enrôlement, il n'a que S_ID et C_ID. J'ai une source de données d'objet pour montrer tous les étudiants nom (dans le texte, et S_ID comme valeur) dans un menu déroulant et il montrera quels cours il est enregistré quand cliqué, en utilisant un DataGrid et une autre source de données d'objet. Je ne vais pas demander à l'étudiant d'avoir plusieurs cours à enregistrer aussi, mais je ne peux pas le faire parce que vous ne pouvez pas avoir le même ID dans la table COURSE, donc chaque étudiant est seulement inscrit à un cours.Problème ASP.NET C# avec la table et la logique SQL

Existe-t-il une sorte d'option pour avoir les mêmes ID dans une table?

Sinon, alors je dois un peu comment manipuler la chaîne dans C_ID dans la table COURSE car tous les cours commencent par ISDVXXX ou ITSXXXX ou HGFXXXX. Cela peut être difficile à comprendre, mais j'espère que quelqu'un aidera. Un exemple peut aider Donc, si un étudiant nommé Joe avec un S_ID de 123 est inscrit à ISDV, il sera inscrit à tous les cours commençant par ISDV. Mais mon problème est que ma table COURSE doit avoir un ID unique pour chaque cours comme ISDV123, ISDV346, ISDV395 etc ... donc cela ruine aussi ma table d'inscription parce que je ne peux pas avoir simplement ISDV là-bas, il a besoin d'un cours spécifique mais il est enregistré à tous. Toute autre précision sera donnée: P Merci ...

Répondre

1

Qu'est-ce que vous » Re essayant de résoudre est un problème d'attribut à valeurs multiples. Fondamentalement, vous avez deux tables où un (students) a une clé primaire qui est une clé étrangère dans une autre table (classes). Vous ne voulez pas avoir des multiples de la même classe dans la table classes, mais vous voulez un student pour pouvoir avoir plusieurs classes. Donc, il y a un correctif très simple, vous créez une autre table qui contient au moins ces deux colonnes: student_id et class_id. De cette façon, vous pouvez avoir un seul class auquel plusieurs students sont liés, ainsi que plusieurs classes auxquels un student peut être lié.

1

Ce que vous cherchez est une relation de plusieurs à plusieurs - c'est-à-dire qu'un seul étudiant peut avoir plusieurs cours, et un seul cours peut avoir plusieurs étudiants. Donc, votre table de liens (est-ce que c'est ce que vous avez prévu pour l'inscription?) Devrait avoir deux colonnes, une pour l'ID du cours et une pour l'ID de l'étudiant.

Donc, si vous aviez étudiant 123 et étudiant 234, et les cours ABC et XYZ, votre table ressemblerait à quelque chose comme:

S_ID C_ID 
123 ABC 
123 XYZ 
234 ABC 

Maintenant, pour votre PK sur les inscriptions, vous pouvez soit utiliser une clé composite, ou ajoutez un entier unique RowId (algorithme Identity ou HiLo).

Dans ce cas, votre table d'inscription ressemblerait à quelque chose comme ceci:

S_ID C_ID  RowID 
123  ABC  1 
123  XYZ  2 
234  ABC  3 

Alors, pour voir ce que les classes d'un élève était, vous pourriez faire quelque chose comme

Select * from courses c 
inner join enrollments e 
on c.C_ID = e.C_ID 
AND e.S_ID = @StudentId 
0

Votre table d'inscription représente la relation m: n entre les tables Studend et Course.

Par exemple votre étudiant avec S_ID = 69 est inscrit aux cours avec C_Id = ISDVXXX, C_Id = ITSXXXX, C_Id = HGFXXXX Un étudiant peut être inscrit à plus de cours et plus d'étudiants peuvent être inscrits au même cours, c'est Pourquoi avez-vous votre table d'inscription? Dans notre exemple, l'inscription comportera les lignes suivantes: (69, ISDVXXX), (69, ITSXXXX), (69, HGFXXXX). Si plus tard un étudiant avec le S_ID = 96 se joint au cours avec C_ID = ISDVXXX, ce qui suit sera les nouvelles lignes du tableau d'inscription: (69, ISDVXXX), (69, ITSXXXX), (69, HGFXXXX), (96, ISDVXXX). La chose importante à comprendre ici est que chaque ligne dans la table d'inscription représente un étudiant inscrit à un cours et il n'y a pas besoin d'autres champs que l'ID de l'étudiant et l'ID du cours, pour ces deux champs identifient ensemble une inscription.