it-swarm.com.de

Warum Flags / Enums in einer Datenbank als Zeichenfolgen anstatt als Ganzzahlen speichern?

Ich habe SQL-Dumps einiger berühmter CMS durchsucht, darunter Drupal 7, Wordpress (einige sehr alte Version)) und einige benutzerdefinierte Anwendungen, die auf Python basieren .

Alle diese Speicherauszüge enthielten Daten mit Zeichenfolgenflags anstelle von ganzzahligen. Beispielsweise wurde der Status eines Posts als published, closed oder inherit anstatt als 1, 2 Oder 3.

Ich habe nur sehr begrenzte Erfahrung im Entwurf von Datenbanken und bin nie an einfachen SQLs vorbeigekommen, aber mir wurde immer beigebracht, dass ich für solche Daten numerische/ganzzahlige Flags verwenden sollte. Es ist offensichtlich, dass tinyint viel weniger Speicherplatz in einer Datenbank belegt als beispielsweise varchar(9).

Also, was vermisse ich? Ist das nicht eine Verschwendung von Datenspeicherung und Datenredundanz? Wäre das Durchsuchen, Suchen und Indizieren nicht etwas schneller, wenn diese Spalten Ganzzahlen anstelle von Zeichenfolgen verwenden würden?

31
trejder

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

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

Was ist mit den Kosten? Die Datenspeicherkapazität war lange Zeit kein Engpass in CMS, da die Festplatten so groß und billig geworden sind. Programmiererzeit hingegen wird normalerweise teurer - daher ist alles, was Entwicklungsaufwand für Speicherplatz handelt, auch aus geschäftlicher Sicht eine gute Sache.

46
Kilian Foth

Ja, das Speichern von Dingen wie yes oder true benötigt mehr Platz als ein winziger Tipp. Dies sollte nicht überraschen. Es macht auch die Indizierung und damit Verknüpfungen für die Datenbank weniger effizient. Es hat auch die Strafe möglicher Verwirrung für den richtigen Wert (yes vs y).

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

Erstens hat MySQL den Typ enum ( docs ), der bei dieser Einrichtung einem booleschen oder eingeschränkten Satz von Zeichenfolgen sehr ähnlich sein kann. Es wird auch erzwungen, dass nur gültige Werte eingegeben werden. Dies ist oft viel nützlicher als das Speichern von 1, 2 oder 3 als Wert, da die Bedeutung mit den Informationen übermittelt wird. Die Aufzählung ist mit der Strafe verbunden, dass eine Schemaänderung erforderlich ist, um Typen hinzuzufügen oder zu entfernen.

Dies bringt uns zu einer untergeordneten Tabelle und Fremdschlüsseln (gilt für alle Datenbanken). Ja, Sie speichern einen Wert als Schlüssel (zurück zum 1, 2 oder 3) und der Wert von published, closed und inherit werden in einer anderen Tabelle gespeichert. Mit einer Ansicht ( docs ) kann es dann so aussehen, als ob 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.

Um genau zu speichern, wie die Dinge gespeichert werden, muss man sich die tatsächliche DDL des Schemas ansehen, um festzustellen, welche Methode verwendet wird, und einen Hinweis darauf erhalten, welche Kompromisse sie ausgewählt haben.

7
user40980