IP-Adressen aus der Sicht einer Datenbank

Einer der aufregendsten Aspekte der Computerprogrammierung ist für mich das Lösen von Problemen. Ich muss die Art und Weise, wie Daten interpretiert werden und wie Daten in Informationen umgewandelt werden können, immer wieder neu bewerten. Nehmen wir zum Beispiel das Problem der Speicherung einer IP-Adresse in einer Datenbank.

Dies ist interessant, weil es auf den ersten Blick kein Problem darstellt. Wenn es jedoch darum geht, ein Feld in einer Tabelle für die IP-Adresse zu erstellen, stehe ich vor der Wahl. Welchen Datentyp soll ich verwenden? Soll ich die IP-Adresse als Zahl oder als String speichern? Es lohnt sich also, einen Blick auf die Definition einer IP-Adresse zu werfen.

Was ist eine IP-Adresse?

William Buchanan beschreibt in Mastering Networks eine IP-Adresse (Internet Protocol) als “eine Adresse, die zur Identifizierung eines Knotens im Internet verwendet wird”. Garfinkel und Spafford (Practical Unix Security) erklären, dass es sich bei dieser Adresse um einen “Satz von 8-Bit-Zahlen” handelt, und geben als Beispiel für eine Adresse die 18.70.0.224 an. Mein Dilemma ist also folgendes – soll ich:

  1. ein einzelnes varchar (variables Zeichen) erstellen, in dem die gesamte Adresse gespeichert wird?
  2. einzelne Felder für jede der 4 8-Bit-Zahlen (oder Oktette) erstellen?

Diese Entscheidung mag willkürlich erscheinen, kann aber große Auswirkungen auf die Art und Weise haben, wie die Daten verarbeitet werden.

Das Problem der IP-Adressdatentypen

Wie Erin Toombs in How to Store an IP Address in a Database erklärt, gibt es bei beiden Speichermethoden in der Datenbank Vor- und Nachteile. Wenn beispielsweise ein varchar verwendet wird, wird die IP-Adresse in der Datenbank in dem Format gespeichert, das der Benutzer erwartet, und eine genaue Suche ist sehr einfach.

Die Suche nach Teilstrings (z. B. nach einem Oktett, das 0 enthält) ist jedoch viel schwieriger und kann zu unerwarteten Ergebnissen führen. Die Speicherung ganzer Zahlen bedeutet, dass die Suche nach einem Oktett einfacher ist, aber die Suche nach einer ganzen IP-Adresse ist komplizierter.

Die Antwort ist natürlich, beides zu speichern.

Die Datenbankansicht einer IP-Adresse

Bevor nun ein Datenbankdesigner zu sehr in Panik gerät, um weiterzulesen, möchte ich erklären, dass ich nicht die Duplizierung von Daten vorschlage. Ich schlage die Verwendung einer Datenbankansicht vor. Diese Ansicht ist einfach eine in der Datenbank gespeicherte Abfrage. In diesem Fall wird sie verwendet, um die vier ganzzahligen Oktette in eine einzelne varchar-IP-Adresse umzuwandeln, und der Ausgangspunkt ist die Erstellung einer Tabelle für die Oktette:

create table ip_octets (oct1 int, oct2 int, oct3 int, oct4 int);

Natürlich ist auch hier eine entsprechende Indizierung erforderlich, aber sobald die Tabelle erstellt wurde, kann die Ansicht erstellt werden:

create view ip_address as select oct1, oct2, oct3, oct4, concat( oct1, ‘.’, oct2,’.’,oct3,’.’,oct4) as ip from ip_octets;

Wenn ich nun die Felder oct1, oct2, oct3 und oct4 mit 18, 70, 0 bzw. 224 befülle, wird das Feld ip in ip_address automatisch 18.70.0.224 enthalten. Die Datenbank wird also beide Formate für die Speicherung von IP-Adressen enthalten, ohne dass zusätzlicher Speicherplatz verbraucht wird.

Schreibe einen Kommentar