2011-01-10 5 views
2

Ich wundere mich über eine grundlegende Datenbank-Design/Datentyp Frage, die ich habe.Datenbankoptimierung: Was ist schnellere Suche nach ganzen Zahlen oder kurzen Strings?

Ich habe eine Porjects-Tabelle mit einem Feld namens "experience_required". Ich weiß, dass dieses Feld immer von einer dieser Optionen bevölkert sein wird: Praktikant, Junior, Senior oder Direktor. Diese Liste kann ein wenig variieren, wenn sich die Zeit ändert, aber ich erwarte keine dramatischen Änderungen an den Items.

Sollte ich für Integer oder String gehen? In der Zukunft, wenn ich Tonnen von solchen Aufzeichnungen habe und sie durch expeirence_required abrufen muss, wird es einen Unterschied machen, sie in Ganzzahlen zu haben?

Antwort

2

Auf jeden Fall für Integer über String gehen.

Die Leistung wird besser und Ihre Datenbank wird näher an der Normalisierung sein.

Schließlich sollten Sie eine neue Tabelle mit dem Namen ExperienceLevel mit den Feldern Id und Title erstellen. Das Feld experience_required in der vorhandenen Tabelle sollte in der anderen Tabelle in einen Fremdschlüssel geändert werden.

Dies wird ein viel stärkeres Design sein, und wird mehr verzeihen, wenn Sie die verfügbaren Erfahrungsstufen ändern, oder entscheiden, ein Erfahrungslevel umzubenennen.

Sie können mehr über Normalisierung here lesen.

+0

Wie würde die Wahl von Integer oder String einen Unterschied zur Normalisierung der Datenbank machen? –

+0

@Larry: Du hast Recht, es wird nicht sein, es sei denn du machst einen Fremdschlüssel. Ich habe den beleidigenden Satz geändert - danke :) –

+0

Selbst mit einem Fremdschlüssel würde das Implementierungsdetail der Verwendung des natürlichen Textschlüssels oder eines Ersatz-Ganzzahlschlüssels den Grad der Normalisierung (oder die Qualität des Entwurfs) der Datenbank nicht beeinflussen. –

1

Ganzzahlen. Zeichenketten sollten IMHO nur verwendet werden, um Textdaten (Namen, Adressen, Text, usw.) zu speichern.

Außerdem sind Integer in diesem Fall besser für Sortieren, Speicherplatz und Wartung.

2

Sie mögen dieses Feld indiziert. Einmal indizierte Ganzzahl und kleine Zeichenkette haben nicht viel (lese vernachlässigbare) Leistungsdifferenz.

1

Theoretisch benötigen Integer weniger Speicher, wenn Sie sie indexieren. Sie können auch enums (in mysql) verwenden, die wie Strings aussehen, aber als ganze Zahlen gespeichert sind.

+0

+1 für Vorschläge für Enums. Die meisten Datenbanken unterstützen sie (in PostgreSQL nehmen sie 4 Bytes auf der Festplatte ein) – ChristopheD

1

spielt keine Rolle. Der Unterschied wäre vernachlässigbar. Welchen Unterschied es gibt, würde die Wahl der Ganzzahl bevorzugen, aber dies ist einer der wenigen Fälle, in denen ich einen kurzen Textschlüssel bevorzuge, da er ein JOIN in vielen Berichtssituationen in eine Nachschlagetabelle zurückspeichert.

0

Um die Gewässer etwas zu verdrücken, schlage ich eine Mischung vor. Beginnen Sie mit der @ GregSansom-Idee (upvoted), aber anstelle von Ganzzahlen verwenden Sie den CHAR(1)-Datentyp mit den Werten I, J, S und D. Dies gibt Ihnen die gleiche Leistung wie die Verwendung von tinyint und bietet den zusätzlichen Vorteil eines einfach zu merkenden mnemonic wenn (wenn) direkt mit den Daten arbeiten. Mit etwas Gebrauch ist es trivial, sich daran zu erinnern, dass "S" "Senior" bedeutet, während 3 keine eingebaute Bedeutung hat - insbesondere wenn, wie Sie vorschlagen, zusätzliche Werte im Laufe der Zeit hinzugefügt werden. (Fügen Sie Probationary als, sagen wir, 5, und das "low rank = low value" Paradigma ist aus dem Fenster.)

Dies funktioniert nur, wenn Sie eine sehr kurze Liste von Elementen haben. Werden Sie zu viele oder zu ähnlich, und es ist schwer, brauchbare Codes zu erstellen.

Natürlich, was ist, wenn diese sequenziellen Werte sind? Sicher klingt es hier. In diesem Fall machen Sie sie nicht 1,2,3,4, machen sie 10, 20, 30, 40, so können Sie später neue Kategorisierungen einfügen. Auf diese Weise können Sie auch Bereiche wie "Alle < 30" (dh weniger als "Senior") problemlos implementieren.

Ich denke, mein Hauptpunkt ist: Kenne deine Daten, wie sie verwendet werden, wie sie sich im Laufe der Zeit verändern können oder werden und plane und code entsprechend!

+0

Nicht absteigend, aber das macht es schwieriger, nach 'select * from ... where rank> = ~ senior ~' zum Beispiel zu suchen ... EDIT: you Habe gerade den Teil über die 10, 20, 30, 40 Range miteinbezogen: Ich denke wirklich, dass das nicht das Beste ist. – ChristopheD

+0

Wie die Daten tatsächlich in dieser speziellen Situation verwendet werden, ist nicht klar, also habe ich nur einige Ideen vorgestellt, die ich in der Vergangenheit benutzt habe –

Verwandte Themen