Tricksen mit dem Primärschlüssel

Wenn man bei MySQL als eindeutigen Primärschlüssel, der genau ein Tupel in einer Tabelle definiert, eine fortlaufende Nummer benutzen möchte, dann bietet sich als Typ eine ganze Zahl, ein Integer mit dem Schlüsselwort int in SQL, an. Dieser fasst 11 Stellen inklusive Vorzeichen, so dass der höchste positive Wert 2,1 Milliarden (231) ist. Was tun, wenn aber der Speicherplatz eines Integer erschöpft ist und bereits gut 2 Milliarden Datensätze existieren?

Dann kann man zum einen durch Hinzufügen von unsigned zur Typendeklaration den abgedeckten Bereich verschieben, indem man nur positive Zahlen als Index verwendet, oder einen großen Integer (bigint) verwenden, der 64 statt 32 Stellen inklusive Vorzeichen fasst und damit mit dem Zusatz unsigned 18,446 Trillionen (263) darstellen kann.

Die Verwendung von Zahlenfeldern des Typs Integer, Float oder Double in Tabellen ist nur zwingend, wenn damit gerechnet werden muss. Da ein Primärschlüssel aber nicht für Berechnungen gebraucht wird, könnte man ihn in einen String schreiben — vorausgesetzt, man kann den Wert nach dem Ablegen noch verwenden, d.h. damit arbeiten und ihn von einem String wieder in eine Zahl wandeln. Das wird allerdings nicht so einfach möglich sein, da ein String normalerweise nur Zeichen enthält. Dieses Problem der Typumwandlung umgeht man, indem man die Zahl in Binärschreibweise einträgt. Normalerweise bekommt man diese Schreibweise nicht zu Gesicht, weil nur der Rechner intern auf diese Weise arbeitet. Beispielsweise kann man die Zahl 5 auch als 1 · 20 + 0 · 21 + 1 · 22 schreiben, wobei die Koeffizienten 1, 0 und 1 die interne binäre Darstellung ergeben.

Natürlich verursacht diese Darstellung mehr Aufwand als die native Repräsentation von Zahlen, da die Arbeit bei der Umwandlung vom Prozessor auf den Programmierer verlagert wird.

Wählt man jetzt für die Speicherung der Bitfolge einen kleines varchar-Feld mit 255 möglichen Zeichen ‘Fassungsvermögen’, so lassen sich bereits 2255 darstellen. Das entspricht gerundet 5,8 · 1076, also stark vereinfachend gesagt einer 5 mit 76 Nullen dahinter. Laut Namen großer Zahlen nennt man diese Zahl fünfzig Duodezilliarden. Wenn man noch größere Zahlen darstellen möchte, wählt man text statt varchar. Damit stehen dann 65.535 Zeichen zur Verfügung, womit sich 1 · 1019728 (“eine Tremilliaducentoktooktogintillion”) speichern lässt. Wer dann immer noch größere Zahlen braucht, nimmt ein mediumtext-Feld, das bis zu 16.777.216 (224) Zeichern speichern kann und eine (für mich) unberechenbar große Zahl darstellen kann.

Man kann den Primärschlüssel aber auch aus mehreren Feldern zusammensetzen, um die Eindeutigkeit selbst bei Millionen oder Milliarden von Datensätzen zu gewährleisten. So braucht man nicht in die Verlegenheit zu kommen, sich Gedanken über Speicherung und Auslesen von Binärdaten in einem String zu machen.

Das alles ist also ein rein theoretisches Modell…

Hinterlasse eine Antwort

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

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>