Aufbau Tabelle - MySQL (allgemein)
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
-
Hallo,
ich bin auf der Suche nach einer Lösung für folgendes Problem:
Tabelle (gekürzt)
persID (Auto) | code | vorname | nachname | ....... 1000 | .... | ....... | Müller | .......
Die Spalten - Namen sollten erstmal selbsterklärend sein.
Nun folgendes:
Max Müller hat seinen Nachnamen zum Bsp. durch Hochzeit in Meier geändert.
Wie würdet ihr / sollte man vorgehen, wenn die Person ihren Nachnamen ändert, ich aber auch den alten Nachnamen noch vor der Änderung für andere Ausgaben benötige?
Ich habe mir jetzt überlegt:
Variante 1:
die Änderung vom Nachnamen in der Haupttabelle und dann in einer Neuen Tabelle den alten Nachnamen zu speichern, die ich dann ggf. mit Joinen muss.
Update
persID | code | vorname | nachname | ....... 1000 | ..... | ..... | Meier | .......
Insert
persID | spalte | text | zeitstempel 1000 | nachname | Müller | 2020-12-09
oder
Variante 2
alles in der alten Tabelle speichern.
Update / Insert
id (Auto) | code | persID | vorname | nachname | ....... | zeitstempel 1000 | .... | 1000 | ....... | Müller | ....... | NULL 1001 | .... | 1000 | ....... | Meier | ....... | 2020-12-09
oder ???
ich würde mich über Vorschläge freuen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi,
das ist ne einfache DB Operation. Wenn du es noch nicht hast, füge Spalte hinzu "Geburtsname". Jetzt hast du die Möglichkeit, bei Namensänderung eine Funktion zu schreiben, die automatisch dann den Nachnamen in Geburtsname kopiert. So kannst du dann bei einem Leeren oder befüllten Feld in einer Standardabfrage verifizieren, dass Geburtsname ungleich Nachname ist.
Eine andere Option wäre, du lässt von vorn herein beide ausfüllen und prüfst beim DB Abruf, ob Geburtsname und Nachname gleich sind oder unterschiedlich.
Beide deiner Varianten sind zu kompliziert gedacht, da es nicht notwendig ist dafür extra Tabellen zu generieren! Ggf. kannst du auch ein Feld in deiner Tabelle einfügen, mit dem Marker ob jemand verheiratet ist oder nicht, um diesen zu nutzen, zu prüfen ob ggf. der Nachname angepasst wurde.
-
Also die Variante von tchiarcos sollte auf jeden Fall als Erstes in Betracht gezogen werden!
Wenn es am Ende doch darum geht, dass man für noch weitere Felder die vorherigen Werte bereithalten muss oder ggfs. sogar ihren genauen Änderungsverlauf nachvollziehen muss, dann kommt man in den Bereich der Historisierung, der Wikipedia-Artikel dazu ist ziemlich ausführlich: https://de.wikipedia.org/wiki/Temporale_Datenhaltung. So etwas ist aber ein großer Implementierungsaufwand (gerade in SQL). Es gibt Datenbanksysteme, die solche Funktionen integriert haben, ich weiß aber nicht, ob man das bei MySQL auch aktivieren kann. -
wenn es jetzt nicht um das konkrete Problem gehen würde, sondern um eines, was technisch keinen Informationsverlust beinhalten darf, würde ich folgendes schema basteln:
Tab Person:
ID (PK, autoincrement), [nicht änderliche und bei änderung irrelevante Atribute bezüglich änderungshistorie]
Tab Person_extended:
ID (PK, FK aus Person), Timestamp(PK+), [änderliche Attribute, können durchaus redundant aufgeführt werden, wenn nur einzelne änderungen sind]
hier würde über die ID die Attribute aus Tabelle person gebunden werden. So wäre es eine 1 zu 1 verbindung. dadurch, dass der zeitstempel in den primärschlüssel mit aufgenommen wurde, hast du eine komplette Chronik der Änderungen zu einem Datensatz. Somit könnte jemand mehrmals heiraten, namen Annehmen, sich scheiden lassen, im Zeugenschutzprogramm aufgenommen werden, Umbenennungen bei Geschlechtsumwandlungen und du könntest nachvollziehen wann jemand zu welchem Zeitpunkt ein attribut geändert hat. somit kannst du die Daten ändern und deine Programmlogik kann jedesmal den Zeitstempel hinterlegen. auch falls sich jemand bei der Eingabe vertippt und nachkorrigiert, wäre es so dokumentiert und nachvollziehbar.
Das wäre eine abwandlung deiner Variante 1, nur dass die Attribute 1 mal da sind. nachteil ist ein wenig overhead, wenn Änderungen die Ausnahme sind. Aber es wäre der saubere weg. gerade bei Userids, die auf den alten Namen laufen bei der verwaltung einer Windows AD kannes für verwirrung sorgen, wenn man nicht weiß, ob Namensänderung vorher oder nachher war.
Die Abfrage wäre einfach, du würdest bem select die nummer rauskramen und das Datum absteigend sortieren. damit hast du den aktuellen Zustand, wenn du auf das erste Feld zugreifst und kannst so auch den Geburtsnamen hinterlegen, wenn du ihn ganz zum Anfang anlegst oder Timestamp auf seinen Geburtstag legst.
Beitrag zuletzt geändert: 22.12.2020 13:27:38 von sebulon -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage