2012-04-02 10 views
1

EDIT zu erhöhen: war ein Design-ProblemZusammengesetzte Primärschlüssel - Verwenden von Aktualisierungsbefehlen. Wie

mein überarbeiteten endgültigen ERD http://i.imgur.com/cgUC7.png

ich ein Computerprojekt für Computing eines Pegels am laufen. Das Projekt besteht aus einer Microsoft Access-Datenbank mit 6 Tabellen. Ich benutze vb.net, um die Anwendung für ein Studentenverfolgungssystem zu programmieren.

Mein ERD ist unten: http://i.imgur.com/Xl0gS.png

Mein Problem: Wie eine neue Verbindung Primärschlüssel in eine vorhandene Tabelle einfügen? Wenn ich StudID und courseid in tblContact erhöhe dann muß ich sie in tblStudentCourse erhöhen, die nicht an die richtigen Richtungen zu Aufzeichnungen führt zeigen ..

Für die Beziehungen der Durchsetzung ich den .relations mit dem Datensatz verwenden.

'Student - StudentCourse 
    DS.Relations.Add(New DataRelation("StudStudCorRelation", DTStudents.Columns("StudID"), DTStudentCourses.Columns("StudID"), True)) 
    'Course - StudentCourse 
    DS.Relations.Add(New DataRelation("CourStudCorRelation", DTCourses.Columns("CourseID"), DTStudentCourses.Columns("CourseID"), True)) 

    StudCourseCompPK(0) = DTStudentCourses.Columns("StudID") 
    StudCourseCompPK(1) = DTStudentCourses.Columns("CourseID") 
    StudCourseContactCompPK(0) = DTContacts.Columns("StudID") 
    StudCourseContactCompPK(1) = DTContacts.Columns("CourseID") 
    StudCourseStudTMACompPK(0) = DTStudentTMAS.Columns("StudID") 
    StudCourseStudTMACompPK(1) = DTStudentTMAS.Columns("CourseID") 
    'Enforces the relations between these 2 keys 
    DS.Relations.Add(New DataRelation("CPKContact", StudCourseCompPK, StudCourseContactCompPK, True)) 
    DS.Relations.Add(New DataRelation("CPKStudentTMA", StudCourseCompPK, StudCourseStudTMACompPK, True)) 
    DS.EnforceConstraints = True 

    DTStudentCourses.PrimaryKey = New DataColumn() {DTStudentCourses.Columns("StudID"), DTStudentCourses.Columns("CourseID")} 

Aber die letzte Zeile hier:

DTStudentCourses.PrimaryKey = New DataColumn() {DTStudentCourses.Columns("StudID"), DTStudentCourses.Columns("CourseID")} 

Bedürfnisse verwendet werden, um die Schlüssel von tblStudentCourse abrufen, die ich unsicher bin, was todo

Wenn jemand einen Blick auf dieses Problem nehmen könnte Ich wäre sehr dankbar.

Harry

ERD Überarbeitete

enter image description here

+0

Ich denke, Sie hätten eine viel bessere Chance auf eine Antwort, wenn Sie ein Hausaufgaben-Tag hinzufügen und reduzieren das Problem, den Compound-Schlüssel, ein * wenig * Code zu zeigen, willig, und einige Tabellenschemata. – Fionnuala

+0

Warum haben Sie CourseID in tblContact? Wenn der Kontakt nur für eine Studenten-Kurs-Kombination relevant ist, muss der Kurs sicher erstellt werden, bevor ein Kontakt relevant ist? Wenn der Kontakt nur für einen Studenten relevant ist, ist die Kurs-ID nicht erforderlich. Es könnte sich lohnen, eine Autonummer-ID auf der Kursteilnehmertabelle zu betrachten. Ich denke, Ihre Probleme können auf Designprobleme zurückzuführen sein, daher lohnt es sich, eine Frage zum Design zu stellen. – Fionnuala

+0

'Warum haben Sie CourseID in tblContact?' Weil ich dachte, dass ich die Eins-zu-viele-Beziehung zwischen tblStudentCourse und tblContact erzwingen muss, es sei denn, ich muss einen anderen Fremdschlüssel verwenden? – Apple

Antwort

0

Wenn ich StudID und courseid in tblContact erhöhen dann muss ich sie in tblStudentCourse zu erhöhen, die Aufzeichnungen führt nicht auf die Zeige richtige Wegbeschreibung.

Nein, Werte werden nur in einer Tabelle erhöht. Überall sonst, wo Sie diese inkrementierten Werte verwenden, kopieren Sie sie im Wesentlichen.

Also tblStudent.StudID könnte eine ganze Zahl sein, die für jeden neuen Schüler um eins erhöht wird. tblCourse.CourseID kann eine ganze Zahl sein, die für jeden Kurs um eins erhöht wird. Um Daten in tblStudentCourse zu speichern, kopieren Sie eine geeignete, vorhandene Ganzzahl aus tblStudent.StudID und eine andere geeignete vorhandene Ganzzahl aus tblCourse.CourseID.

StudID wird nur an einer Stelle inkrementiert - tblStudent. CourseID wird nur an einer Stelle erhöht - tblCourse.

+0

Wenn Sie also einen neuen Kontaktdatensatz erstellen, sind die Werte StudID und CourseID in tblContact dieselben wie in tblStudent. tblKurs? Weil ich noch eine viel zu viele Beziehung zwischen tblStudentCourse und tblContact erzwingen muss, weil Studenten viele Kontaktzeiten haben können. – Apple

+0

@Apple: Wenn ich Ihr Design richtig verstehe, wenn Sie eine neue Kontaktzeile erstellen, stimmen die Werte für StudID und CourseID mit einer Zeile in tblStudentCourse überein. Das garantiert, dass es sich bei dem Kontakt um einen Kurs handelt, in dem sich der Student tatsächlich befindet. ("Studenten können viele Kontaktzeiten haben" beschreibt eine Eins-zu-Viele-Beziehung.) –

+0

Das ist richtig, aber (da fällt mein Wissen auseinander) Primärschlüssel die Werte in TblstudentCourse muss sicherlich eine andere Reihe von neuen Schlüsseln sein? Ex. Wenn Sie ohne CPKs arbeiten, würden Sie eine z. ContactID, das in tblContact und tblStudentCourse wäre (beachten Sie das Convo mit Remou atm). Die neuen Werte, die sich auf tblContact beziehen, müssen sich also an einem anderen magischen Speicherort befinden, d. H. Die zwei Fremdschlüssel werden zusammengeführt, um einen zusammengesetzten Primärschlüssel zu erzeugen. Was ich nicht weiß ist, wo sich dieser Ort befindet ... – Apple

Verwandte Themen