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
, closed
oder inherit
nicht 1
, 2
oder 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 tinyint
in 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?
quelle
char
s? Wie ineffizient!" ist veraltet im Vergleich zu 2015.Antworten:
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.
quelle
Ja, das Speichern von Dingen wie
yes
odertrue
nimmt 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 (yes
vsy
).Es gibt jedoch viele Ansätze, die dem Speichern von Zeichenfolgen in der Datenbank (insbesondere MySQL) ähneln und effizient sind.
Erstens hat MySQL einen
enum
Typ ( 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 Speicherung1
,2
oder3
als 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
,2
oder3
) und der Wert vonpublished
,closed
undinherit
in 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