Vivisektion II – Noch mehr Winzenfledderei

Der Tag war bös anstrengend und kopflastig, daher wird die Geschwindigkeit erstmal etwas geringer…

Zwei Themen hatte ich im letzten “Winzen-Beitrag” nicht genauer beschrieben, und ich sollte sie noch nachholen: Polyvalenz und Null-Werte. 

a) Polyvalenz von Feldern: Der Inhalt eines Feldes (Datenbank-Slang: Attributs) besteht aus mehreren Werten, die unterschiedliches abbilden. Das betrifft z.B. das Feld Name/ID, wo sich Vor- und Nachname, sowie im Detail einiges mehr treffen. Das muss natürlich auseinander dividiert werden. Das betrifft aber auch Felder aus den Detailthemen “weiter rechts”, in denen sich Christian die Möglichkeit zum Beleg wünscht. Faustregel: Pro Information ein Feld – für alles. Vor- und Nachname sind definitiv zwei Informationen, denn den Nachnamen teile ich mit meiner Mutter, den Vornamen nicht. “Reichsarbeitsdienst” und “1940” haben zwar eine enge Beziehung, aber tragen alleine schon Informationen: War Person X beim Reichsarbeitsdienst? Ja. Ist Person X im Jahr 1940 einer NS-Organisation beigetreten oder wurde verpflichtet? Ja.

b) Uneinheitliche Null-Werte / uneinheitlicher Wertebereich. Für die Speicherung in der Datenbank hebt sich JA/NEIN gegen einen Wert wie NULL, “” oder “#” deutlich ab. Nicht aber für Programmiersprachen und die Abfragesprache. Man tut gut daran, den Wertebereich strikt zu begrenzen, damit man nicht durch ganz banale Fehler später Treffer verliert. JA/NEIN lässt sich sehr gut durch den Typ Boolean abbilden, Alternativen wäre ein ENUM  (ENUMs sind streng genommen lineare Wertereihen, die jeweils aber ein Label haben, z.B. “JA”, “NEIN”, “VIELLEICHT”, “KEINE BELEGE”, “UNBEKANNT”. Der Charme ist, dass man Enums bei ihrem “Namen”, aber auch ihrem Index ansprechen kann. Zu dieser Liste wären also auch 0 (keine Auswahl), 1 (JA), 2 (NEIN) usw. gültige Werte. Und auch mit dem anderen genannten Typ kann man ein bisschen zocken (auch wenn das nicht immer klug ist): MySQL speichert Boolsche Werte als tinyint(1) ab, also Ganzzahlwerte, wobei 1 = WAHR und 0 = FALSCH ist. Eine Boolean kann so auch -1 werden, ist also anders als 1 (folglich nicht wahr), aber auch anders als 0 (eben auch nicht falsch) – eine Möglichkeit, um Werte zu markieren, die weder wahr noch falsch sind, weil sie noch nicht ausdrücklich wahr oder falsch gesetzt wurden. Der Typ Boolean kann kein NULL enthalten, was sonst das typische Mittel für “kein Wert” ist, insofern muss man mit Boolean-Spalten tricksen, wenn man mit Gewalt den dritten Zustand reindrücken will.

Aber auch ein Char(1) wäre denkbar mit Wertebereich J,N, Null – es gibt aber einen Haken: j und J sind nicht dasselbe. Man könnte nun immer nach dem Großbuchstabenwert von Spalte Y fragen, aber das ist dann auch wieder ein zweiter Schritt, um eine Aussage zu erhalten. Insofern kann man als saubersten Weg verbuchen, dass man Enums verwendet – entweder schon beim Programmieren oder Erfassen der Werte, oder durch die Umwandlung aus der Textform.

In der nächsten Runde gehe ich dann einmal durch die Datentabelle durch, dann haben wir den ersten Teil “schon” geschafft, das Datenmodell zu erstellen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.