Warum sollten Flags / Enums in einer Datenbank als Zeichenfolgen statt als Ganzzahlen gespeichert werden?

29

Ich habe SQL-Dumps einiger berühmter CMSs durchsucht, darunter Drupal 7, Wordpress (eine recht alte Version) und eine benutzerdefinierte Anwendung, die auf Python basiert.

Alle diese Speicherauszüge enthielten Daten mit Zeichenfolgenflags anstelle von ganzzahligen. Zum Beispiel des Status eines Posts wurde wie folgt dargestellt published, closedoder inheritnicht 1, 2oder 3.

Ich habe nur begrenzte Erfahrung mit dem Entwurf von Datenbanken und bin nie an einfachen SQL-Anweisungen vorbeigekommen. Mir wurde jedoch immer beigebracht, dass ich für solche Daten numerische / ganzzahlige Flags verwenden sollte. Es ist offensichtlich, dass tinyintin einer Datenbank viel weniger Speicherplatz verbraucht wird als zum Beispiel varchar(9).

Was vermisse ich also? Ist das nicht eine Verschwendung von Datenspeicher und Datenredundanz? Wäre das Durchsuchen, Suchen und Indizieren nicht ein bisschen schneller, wenn diese Spalten Ganzzahlen anstelle von Zeichenfolgen verwenden würden?

trejder
quelle
7
Sind Sie sicher, dass sie nicht tatsächlich dev.mysql.com/doc/refman/5.0/en/enum.html verwenden, was wie eine Zeichenfolge in dump aussieht ? So oder so denke ich, heutzutage zählt es fast als Mikrooptimierung.
Esben Skov Pedersen
2
Diese Frage ist grundsätzlich ein Aufruf an die Behörde.
DeadMG
3
Keine vollständige Antwort, aber ... Sie kennen die Skriptsprache Lua? Bekannt dafür, direkt und leistungsstark zu sein, ganze Spiele-Engines usw. zu schreiben? Überraschenderweise ... haben sie sich nie die Mühe gemacht, überhaupt einen Nummerntyp zu haben. Ihr Code zur Behandlung von Zeichenfolgen ist so effektiv, dass sie Zahlen, die tatsächlich Zeichenfolgen sind, in einem zeitkritischen Code der Game-Engine addieren können. Wie JavaScript haben sie nicht einmal Objekte - nur sehr ausgefallene Hash-Tabellen. Die Ansicht des C-Programmierers von "einer großen Anzahl von chars? Wie ineffizient!" ist veraltet im Vergleich zu 2015.
Katana314
2
Bearbeitet, um den Teil "Appell an Autorität" zu entfernen, und erneut abgestimmt, da die Frage nach der Verwendung von Zeichenfolgen anstelle von Ints vollkommen thematisch ist, solange es nicht speziell um diese "Autoritäten" geht.
Ixrec

Antworten:

45

Ja, das Speichern von Zeichenfolgen anstelle von Zahlen kann mehr Platz beanspruchen. Der Grund, warum hochkarätige pltforms dies sowieso tun, ist, dass sie der Meinung sind, dass der Nutzen dieser Lösung größer ist als die Kosten.

Was sind die Vorteile? Sie können einen Datenbankspeicherauszug leicht lesen und verstehen, worum es geht, ohne die Aufzählungstabellen auswendig zu lernen, und selbst halboffizielle GUIs verwenden möglicherweise einfach die themenbezogenen Werte, anstatt den Datensatz zu transformieren, den sie erhalten. (Dies ist eine grundlegende Form des Kompromisses zwischen Speicherplatz und Verarbeitungszeit.)

Was ist mit den Kosten? Datenspeicherkapazität war lange Zeit nicht mehr der Engpass in CMS, da die Festplatten so groß und billig geworden sind. Andererseits wird die Zeit für Programmierer in der Regel teurer. Alles, was Entwicklungsaufwand für Speicherplatz bedeutet, ist aus geschäftlicher Sicht auch eine gute Sache.

Kilian Foth
quelle
7

Ja, das Speichern von Dingen wie yesoder truenimmt mehr Platz in Anspruch als ein Winzling. Dies sollte nicht überraschen. Dadurch wird auch die Indizierung und damit der Join für die Datenbank weniger effizient. Es hat auch die Strafe der möglichen Verwechslung für das, was der richtige Wert ist ( yesvs y).

Es gibt jedoch viele Ansätze, die dem Speichern von Zeichenfolgen in der Datenbank (insbesondere MySQL) ähneln und effizient sind.

Erstens hat MySQL einen enumTyp ( docs ), der beim Einrichten auf diese Weise einem Booleschen oder einem eingeschränkten Satz von Zeichenfolgen sehr ähnlich sein kann. Außerdem werden nur gültige Werte eingegeben. Dies ist oft viel nützlicher als die Speicherung 1, 2oder 3als Wert wie die Bedeutung , die Informationen vermittelt. Die Aufzählung hat den Nachteil, dass eine Schemaänderung erforderlich ist, um Typen hinzuzufügen oder zu entfernen.

Dies bringt uns zu einer untergeordneten Tabelle und Fremdschlüsseln (gültig für alle Datenbanken). Ja, Sie einen Wert als Schlüssel (zurück zum Speichern sind 1, 2oder 3) und der Wert von published, closedund inheritin einer anderen Tabelle gespeichert. Mit einer Ansicht ( docs ) können Sie dann festlegen, dass die Tabelle die Zeichenfolge und nicht den Schlüssel enthält. Dies hat den Vorteil, dass keine Schemaänderung erforderlich ist, um Einträge zur untergeordneten Tabelle hinzuzufügen oder daraus zu entfernen.

Genau wie Dinge gespeichert sind, müsste man sich die tatsächliche DDL des Schemas ansehen, um zu bestimmen, welche Methode verwendet wird, und einen Hinweis darauf zu erhalten, welche Kompromisse sie ausgewählt haben.


quelle