Sven Rautenberg: PrimaryKeys - welchen nehme ich?

Beitrag lesen

Moin!

ich habe in einer Tabelle ein Attribut "URL" (varchar(255)), das bereits minimal identifizierend ist. Spricht irgendwas dagegen, das dann auch als Primary Key einzusetzen? Oder sollte ich besser einen extra Schluessel einfuehren?

Ein Schlüssel des Typs varchar(255) benötigt schlimmstenfalls 255 Byte je Dateneintrag - auch bei Referenzierungen in anderen Tabellen.

Ein Schlüssel vom Typ BIGINT benötigt 8 Byte (kleinere Int-Typen entsprechend weniger). Eine URL hingegen benötigt ja schon mindestens 3 Zeichen für "://", dann noch 3 bis 4 Zeichen für das Protokoll (ftp, http,...), und die Domain besteht auch mindestens aus 4 Zeichen (Länderdomain plus kürzestmögliche SecondLevelDomain = x.yz). In der Summe also 10 Bytes für eine extrem unwahrscheinliche URL.

Natürlich muß die URL so oder so gespeichert werden, egal ob sie nun Primary Key ist, oder nicht. Aber der Sinn eines Primärschlüssels ist ja gerade, ihn als Fremdschlüssel in anderen Tabellen zu verwenden - und genau da wirds dann verschwenderisch beim Speicherplatz.

Die URL grundsätzlich als UNIQUE-Index zu definieren ist davon unabhängig - dient aber in erster Linie dazu, dass die Datenbank Duplikate verhindert. Aber gerade sowas ist bei URLs problematisch, denn zwei unterschiedliche URLs können dennoch die gleiche Ressource bezeichnen - sei es durch Redirect, serverinterne Duplizierung oder unterschiedliche Codierung der URL. Umgekehrt kann unter einer einzigen URL durchaus unterschiedlicher Content erreichbar sein (Content Negotiation mit unterschiedlichen Sprachen oder Kompression).

Eine URL ist daher bei genauer Betrachtung gar nicht so einzigartig, wie man es vielleicht gerne hätte. Und damit potentiell ungeeignet als Key in der Datenbank.

- Sven Rautenberg

--
"Love your nation - respect the others."