![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Erfahrener Benutzer
Registriert seit: 08.01.2006
Ort: Mannheim
Beiträge: 481
|
Hallo,
folgendes Problem: Ich habe eine 4stellige Zahl zur Verfügung, für 400 Schüler. Jeder dieser Schüler soll in einer Datenbank gespeichert werden, zusammen mit seiner Schülernummer. Diese wird ihm automatisch zugeordnet. Soweit könnte man autoincrement nutzen. Aber irgendwann bin ich bei der Schülernummer 9999, was dann? Zudem wäre es besser, wenn sobald ein Schüler die Schule verlassen hat, diese Schülernummer wieder freisteht, einfach um möglichst wenig Altlasten rumzuschleppen. Wie kann ich also erreichen, dass wenn ich bei der Schülernummer 275 bin und der Schüler 150 die Schule verlässt, der nächste neue Schüler die Nummer 150 bekommt, statt 276? Irgendwie finde ich grad keinen Ansatz....
__________________
Jan info.malte-gerth.de ================================= Nutzt bitte lieber Jabber statt ICQ: malte.gerth@jabber.cz |
|
|
|
|
|
Nach oben #2 |
|
Semantic Web Fanatic
Registriert seit: 03.06.2006
Beiträge: 237
|
Ich denke, dass müsstest du von Hand machen.
Alle Datensätze auflisten und dann die IDs durchgehen und bei einer Lücke die freie ID benutzen. Warum hast du denn nur eine 4stellige Zahl? Der Sinn von Autoincrement und einer ID liegt ja darin, dass man einen Datensatz immer eindeutig identifizieren kann, auch wenn er nicht mehr existiert. Denn dann kann man ihn als nicht existent identifizieren. Kommt auf die Anwendung an, ob das möglich ist.
__________________
Applikations-Programmierung: BlitzMax, BlitzPlus Webentwicklung: PHP, (X)HTML, CSS, JavaScript, MySQL |
|
|
|
|
|
Nach oben #3 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
|
Die Spalte muss unique sein, damit Doppelungen unterbunden werden.
Und dann musst du prüfen, wenn du einen neuen Schüler einsetzen willst, ob (d)eine ID noch frei ist. Ggf. kannst du das auch wie in dem filesystem machen, indem du eine Tabelle mit noch freien Nummern pflegst. Das hätte den Vorteil, dass du stets die Nummer als erstes nehmen kannst, die am längsten nicht mehr benutzt wurde, indem du das Freiwerden der Nummer mit einem Datum versiehst.
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #4 |
|
Erfahrener Benutzer
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 296
|
Du kannst den Auto-Increment-Wert nach dem Löschen einfach auf 1 setzen. MySQL füllt dann selbstständig die Lücken, ohne etwas zu überschreiben. (Zumindest wenn die Spalte als PK definiert ist)
Code:
ALTER TABLE tableFooBar AUTO_INCREMENT=1
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. |
|
|
|
|
|
Nach oben #5 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
|
Ich finde das System konzeptionell bedingt nicht gut.
Es sollte eine eindeutige ID sein - und nicht vom Zeitpunkt abhängen wer gerade welche ID hat. Ich würde - wenn es systembedingt notwendig ist - dafür eine extra-Spalte einsetzen in der dann die 4stellige Zahl abgespeichert wird.
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #6 |
|
Erfahrener Benutzer
Registriert seit: 08.01.2006
Ort: Mannheim
Beiträge: 481
|
Gedankengang ist folgender:
Die Schule hat eine maximale Kapazität von 400 Schülern. Geben wir dem ersten Schüler die Nummer 1, dem zweiten die 2 usw. Dann sind wir nach einem Jahren bei Schülernummer 400. Nach einem weiteren Jahr gehen 100 Schüler ab, 100 neue kommen. Dann wären wir bei der Schülernummer 500. Nach 5 weiteren Jahren wären wir bei 1000. Zudem soll jeder Schüler ja eine Karte bekommen, auf der seine Schülernummer steht. Da müsste man so jedes Jahr 100 neue machen. das wäre nur möglich, wenn man Papierkarten nimmt. Die Idee war jedoch, so Plastikkarten zu nehmen. 400 Stück, jede mit einer Schülernummer. Diese Nummer und Karte behält der Schüler bis er die Schule verlässt. Dann gibt er sie zurück.
__________________
Jan info.malte-gerth.de ================================= Nutzt bitte lieber Jabber statt ICQ: malte.gerth@jabber.cz |
|
|
|
|
|
Nach oben #7 |
|
Erfahrener Benutzer
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 296
|
Ja, dann mach es mit einer extra Spalte (FK) und einer zusätzlichen Tabelle (dort kannst du dann auch noch weitere Informationen zur Karte speichern: Karte gesperrt etc.)... Das wäre die schönste Lösung...
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. |
|
|
|
|
|
Nach oben #8 |
|
BIN EIN KRASSA HELD!!!111
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.185
|
Die Frage die sich stellt, sind alle Dinge die mit der Nummer in Zusammenhang stehen auch sicher am ende des schuljahres vorbei ? Nicht dass irgendwo dann steht der schüler mit der nummer xy hat buch Z nicht zurückgegeben und am ende erbt das dann der nachfolger mit dieser nummer und hat erstmal den ärger damit.
Auch wozu man diese karten braucht ? Hat nicht jeder Schüler üblicherweise nen Schülerausweis ? |
|
|
|
|
|
Nach oben #9 |
|
Erfahrener Benutzer
Registriert seit: 08.01.2006
Ort: Mannheim
Beiträge: 481
|
Nein, als Grundschüler nicht
Ja, am Ende des Schuljahres ist alles erledigt. Es gibt keine Informationen die man im neuen Schuljahr benötigt.
__________________
Jan info.malte-gerth.de ================================= Nutzt bitte lieber Jabber statt ICQ: malte.gerth@jabber.cz |
|
|
|
|
|
Nach oben #10 |
|
BIN EIN KRASSA HELD!!!111
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.185
|
hmm wie wärs es einfach zu machen und keine user zu löschen ? sondern nur den eintrag auf "deleted" setzen und dann kannst du, wenn du nen neuen erstellst einfach nen alten datensatz überschreiben ?
|
|
|
|
|
|
Nach oben #11 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
|
sozusagen einfach mit einem update auf den alten Datensatz die neuen Daten eintragen....
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #12 |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
|
Hallo Jan.
Ich schalge dir folgendes Vorgehen vor: Jeder Schüler hat im DV-System eine eindeutige ID, die auch nach dem ausscheiden bestehen bleibt bzw. eben nicht wiederverwertet wird. Jedem Schüler wird die ID einer Karte zugewiesen, die er hat. Ob diese Karten-ID dann auch die (gerade aktuelle) Schüler-Nummer ist oder eben nur die Karten-Nummer kann dann immernoch frei entschieden werden. Wenn dem Schüler eine 4-stellige, „wiederverwendbare“ Nummer zugewiesen wird, dann speichere diese unbedingt im Zusammenhang mit dem Ein- und Austrittsdatum in die bzw. aus der Schule. Damit wird diese Nummer wieder eindeutig. Klar muss dann jede Anfrage, die den Schüler hinter der Nummer erkennen möchte ein Datum enthalten. Eine Möglichkeit der Gestaltung der internen und eindeutigen ID wäre noch das Schema <Zweistellige Jahreszahl Schuleintritt>-<Karten-Id>, also z.B. 08-175. Damit hast du sowohl eine eindeutige ID, als auch die Kartennummer mit drinnen. Bastian |
|
|
|
|
|
Nach oben #13 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
|
Zumal das ausreichen dürfte, wenn jedes Jahr nur max 99 neue Schüler dazukommen!!!
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #15 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
|
Ich denke, dass Jan uns diese Frage beantworten können wird. Hier in Niedersachsen geht die Grundschule von Klasse 1 bis Klasse 4.
Vier Jahrgänge also. Wenn dann wie oben beschrieben 400 Schüler an der Schule sind komme ich auf exakt 100 pro Jahrgang (unter der von mir getroffenen Annahme). Wenn die Angabe von 400 nun also nur ein Pi-mal-Daumen wert ist, dann kommt das mit den 99 pro Jahrgang, die jedes Jahr neu dazu kommen nämlich durchaus hin. Aber wie gesagt - Jan wird das klären können! Das System hat natürlich den Nachteil, dass wenn ein geburtenstarker Jahrgang kommt das Zahlensystem nicht mehr funktioniert!
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #16 |
|
Erfahrener Benutzer
Registriert seit: 08.01.2006
Ort: Mannheim
Beiträge: 481
|
Jann, welches System meinst du?
Die Schule darf maximal nur 380 Schüler aufnehmen. Sonst gibts großen Ärger mit den Behörden. Die Idee mit der extra Tabelle für die Karte finde ich nicht schlecht, muss mir das nochmal genauer anschauen. Dazu direkt eine Frage, bisher hab ich keine JOINS benutzt, aber wie sähe der denn aus in diesem Fall?
__________________
Jan info.malte-gerth.de ================================= Nutzt bitte lieber Jabber statt ICQ: malte.gerth@jabber.cz |
|
|
|
|
|
Nach oben #17 |
|
Erfahrener Benutzer
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 296
|
Code:
SELECT `student`.`name`, `student`.`address`, `card`.`number` FROM `student` INNER JOIN `card` ON card.cardId = schueler.cardId Code:
SELECT `student`.`name`, `student`.`address`, `card`.`number` FROM `student` LEFT JOIN `card` ON card.cardId = schueler.cardId Siehe auch: http://en.wikipedia.org/wiki/Join_(SQL)
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. |
|
|
|
|
|
Nach oben #18 | |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
|
Ich meinte etwas in Anlehnung hieran:
Zitat:
Das klappt dann, wenn du definitiv immer weniger als 100 neue Schüler pro Jahr aufnehmen willst. Die Schüler dieses Jahres hätten dann 0801 bis 0899, die Schüler des nächsten Jahres dann 0901 bis 0999. Damit hättest du dann erst in 10 Jahren den Fall, dass eine ID erneut benutzt wird auch wenn du den Zahlenbereich dann nicht ganz ausschöpfen wirst, aber du kannst aufgrund der ersten beiden Zahlen schon sagen wann der Schüler eingeschult wurde.
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
|
Nach oben #19 |
|
Erfahrener Benutzer
Registriert seit: 08.01.2006
Ort: Mannheim
Beiträge: 481
|
Ok, werde mal das mit der Tabelle für die Karte ausprobieren.
Dazu gleich eine Frage, kann ich ein JOIN auch mit UPDATE oder INSERT nutzten?
__________________
Jan info.malte-gerth.de ================================= Nutzt bitte lieber Jabber statt ICQ: malte.gerth@jabber.cz |
|
|
|