MySQL / PostgreSQL Säulengrößen, warum?

Ich entwickle ein Programm und lief in einen Bug, wo ein Wert in eine Tabellen Spalte, die den Typ int hat , und der Wert ist größer als Integer.MAX_VALUE es spuckt einen Fehler sagen, dass die Zahl zu groß ist. Ich habe gelesen, dass das Update für das ist ganz einfach nur ändern Sie den Tisch zu BigInt und das sollte es beheben. Aber das hat mich nicht gedacht, warum nicht alle Programmierer nur die max Spaltenwerte (wie Varchar (255), BigInt, etc.) anstatt etwas kleiner wie Varchar (30) oder Int?

Würde das nicht fast einen Fehler beseitigen, wie es bei mir vorkommt, wenn du nicht sicher bist, was eingefügt werden soll, besonders wenn es auf Benutzern basiert? Gibt es irgendwelche Nachteile in nur die Verwendung der größtmöglichen Art, die Sie für die Spalten benötigen? Wäre die Tischgröße größer, auch wenn man nur "2" in einer großen int Spalte (obwohl das mit int funktionieren würde)? Gibt es einen performancesverlust?

Vielen Dank!

Für Varchar, der Grund, warum Sie in der Regel nicht nur MAX ist, weil es es anders speichert und setzt Einschränkungen auf Ihre Index-Wartungsarbeiten. Zum Beispiel können Sie einen Index "online" nicht mit einem varchar (max) Feld aufbuild. Zwar gibt es eine kleine Hand winken beteiligt, im Grunde varchar (max) data gespeichert werden aus Zeile, so gibt es Overhead bei der Aufrechterhaltung, dass zusätzliche dataspeicher.

Bei numerischen Typen ist die Hauptsache Platz. Bigint ist ein 8-Byte-character integer, während ein int nur 4 Bytes ist. Wenn Sie nicht brauchen einen Raum größer als 2,4 Milliarden, das ist nur verschwendet Platz (und oft eine Menge davon, wenn Sie haben, sagen, 2,4 Milliarden Zeilen von data).

Data Compression kann einige dieser Probleme lösen, aber nicht ohne die Kosten für die Dekomprimierung der data, wenn es abgefragt wird.

Also die Gründe sind vielfältig, aber mit der möglichen exception der Verwendung größerer Varchars (nicht varchar (max)), Kommissionierung der "richtigen" datatyp für Ihre data ist nur eine gute Idee.

Ich kann nicht mit irgendwelchen RDBMS anders als SQL server sprechen (aber ich stelle mir das alles für alle von ihnen vor) … Ein BIG INT nimmt doppelt so viel Platz ein wie ein INT … was bedeutet, dass weniger data auf eine Seite passen weniger data im Cache bedeutet langsamer performance.

In SQL server gibt es eigentlich 4 INT-Typen:

TINYINT (1 Byte),

SMALLINT (2 Bytes),

INT (4 Bytes),

BIGINT (8 Bytes).

Ein guter database-Entwickler wird sehr sorgfältige Gedanken in die Wahl der richtigen datatyp auf der Grundlage der data, die erwartet wird, um in der Spalte gesetzt werden. Abgesehen von der Ausgabe des memoryplatzes fungieren datatypen als databeschränkungen. Also, wenn ich TINYINT als meinen datatyp wähle, heißt das, ich erwarte nur Werte zwischen 0 und 255 und werde alles ablehnen, was außerhalb dieses Bereichs liegt.

Wenn ein Mitarbeiter ein Tischdesign mit allen VARCHAR (255) & BIGINTs einreichen würde, würde ich es ablehnen und sie alles ordnungsgemäß haben. Es ist faul Denken so, das verursacht riesiges Problem auf der DB-Seite des Hauses.

warum nicht alle Programmierer nur die max Spalte Werte (wie Varchar (255), BigInt, etc.) anstatt etwas kleiner wie Varchar (30) oder Int?

Manche tun genau das. Es ist auch gar nicht ungewöhnlich, dass die Entwickler auch in varchar-Spalten numerische oder dates- / time-Werte speichern können.

Ich sehe oft performance und memorykosten als Grund an, dies nicht zu tun. Das sind Überlegungen (die je nach DBMS variieren), aber ein wichtigeres in der Welt der relationalen databaseen ist die dataintegrität. Der gewählte datatyp ist ein kritischer Teil des datamodells, da er die Domäne der data speichert, die gespeichert werden können. Darüber hinaus bieten relationale databaseen Check-, Referential- und NULL-Constraints, um die Spaltenwerte weiter zu begrenzen.

Würde das nicht fast einen Fehler beseitigen, wie es bei mir vorkommt, wenn du nicht sicher bist, was eingefügt werden soll, besonders wenn es auf Benutzern basiert?

Natürlich, aber warum bei einer 64-Bit-Integer zu stoppen? Warum nicht NUMERIC (1000)? Das ist eine rhetorische Frage, um darauf hinzuweisen, dass man über die Geschäftsdomäne wissen muss, damit data ordnungsgemäß modelliert und validationsregeln erzwungen werden können. Eine 64-Bit-Ganzzahl ist sicherlich übertrieben, um eine Person Anzahl von Kindern zu speichern, aber Sie können am Ende mit einem Wert von mehreren Milliarden wegen unvorsichtiger dataeingabe. Der Spaltendatentyp ist die letzte Verteidigung für schlechte data und ist besonders wichtig, wenn er von den Benutzern basiert.

Alles, was gesagt wird, kann man ein RDBMS als nichts anderes als eine dumme memory-Engine und erzwingen data Integrität Regeln (falls vorhanden) in Anwendungscode. In diesem Fall sind Lagerung und performance die einzige Überlegung.