2010-12-21 18 views
1

Ich schreibe ein Online-Bewerbungsformular und eines der Daten, die ich sammeln möchte, ist die Geschichte der Benutzerschulung; Schulname, Schulstadt, Jahre waren sie dort und Erfolge während dort. Diese Daten können für beliebig viele Schulen zwischen null und ungefähr vier Schulen gesammelt werden, und der Benutzer fügt bei Bedarf dynamisch weitere Felder hinzu.Eine unbekannte Anzahl von Zeilen in eine MySQL-Datenbank einfügen

Meine Frage ist, wie würde dies in der Datenbank erfasst werden, da ich nicht weiß, wie viele Schulen der Benutzer hinzufügen wird? Kann es in einer Tabelle durchgeführt werden, oder muss ich mehrere Tabellen erstellen und die Bildungsdaten in einer separaten Tabelle erfassen?

Jede Hilfe oder Hinweise würden sehr geschätzt werden.

Danke.

+3

Ich schlage vor, dass Sie eine Lese auf den Wikipedia-Artikel über [Datenbank Normalisierungs] geben (http://en.wikipedia.org/wiki/Database_normalization) ... – ircmaxell

Antwort

3

Sie benötigen separate Tabellen. Eine mit einer Reihe pro Person und eine mit einer Reihe pro Schule. Schulen können mit Personen in Verbindung gebracht werden, die entweder eine personID in der Schulbank oder eine zusätzliche Tabelle für die Beziehung "Person besuchte Schule" verwenden.

Jede Zuordnung einer Entität (Person) zu mehreren anderen Entitäten (Schulen) erfordert mehr als eine Tabelle. Als allgemeine Regel gilt eine Tabelle pro Entität sowie zusätzliche Tabellen für Viele-zu-Viele-Beziehungen.

1

Machen Sie eine separate Tabelle für Bildung, und modellieren Sie eine "Bildung" in PHP als eine separate Klasse.

1

Der Begriff dafür ist Normalisierung. Sie möchten mehrere Tabellen so strukturieren, dass eine Datenzeile prägnant ist und so wenig Informationen wie möglich wiederholt werden. Dies kann getan werden, indem Sie in Ihrem Kopf herausfinden, welche Teile der Information wiederholt werden, und einen Tisch für diese Information erstellen.

Daten zwischen den Tabellen sind über Primärschlüssel (hoffentlich Auto Inkrement Ganzzahlen) verknüpft. In diesem Fall hätten Sie zwei Tabellen: Student und Education. Die Student-Tabelle würde "StudentID, Name usw." haben, während die Education-Tabelle "EducationID, StudentID, SchoolName, SchoolCity, SchoolStudentID, usw." hätte.

Beachten Sie, dass Student.StudentID mit Education.StudentID passen würde und kann mit der folgenden Abfrage erworben werden:

select Student.*, Education.* from Student left join Education on Student.StudentID = Education.StudentID 

In der Tat wird diese ‚School‘ haben und ‚SchoolCity‘ zu wiederholen immer und immer wieder, so Dies ist nicht vollständig normalisiert. Um fortzufahren, müssen Sie es ein wenig ändern, wieder:

Student: StudentID, Name, etc 
School: SchoolID, SchoolName, SchoolCity, etc 
Education: StudentID, SchoolID, StudentSchoolID, etc 

Hinweis: Jeder Schüler hat einen anderen Schüler-ID an jeder Schule, die sie besuchen - nicht verwechseln mit der Autoinkrement integer ‚StudentID‘. Um eine Liste in diesem Fall zu erhalten:

select Student.*, Education.StudentSchoolID, School.* from 
    Student left join Education on Student.StudentID = Education.StudentID 
    left join School on Education.SchoolID = School.SchoolID 
Verwandte Themen