Gibt es einen Grund, auto_increment nicht für einen Index einer Datenbanktabelle zu verwenden?

7

Ich habe die Aufgabe übernommen, eine sehr schlecht codierte E-Commerce-Site zu unterhalten, und ich arbeite daran, einen Großteil des Codes zu refactorieren und zu versuchen, laufende Fehler zu beheben.

Jede Datenbankeinfügung (Hinzufügen eines Artikels zum Einkaufswagen usw.) beginnt mit einer Funktion "grab_new_id", die die Anzahl der Zeilen in der Tabelle ZÄHLT und dann beginnend mit dieser Nummer die Datenbank abfragt, um eine nicht verwendete Indexnummer zu finden. Zusätzlich zu der Tatsache, dass es in Bezug auf die Leistung schrecklich ist (es gibt bereits mehr als 40.000 Zeilen und Indizes werden regelmäßig gelöscht, so dass es manchmal mehrere Sekunden dauert, nur um eine neue ID zu finden), bricht dies regelmäßig, wenn zwei Operationen gleichzeitig ausgeführt werden, wenn zwei Einträge hinzugefügt werden mit doppelten ID-Nummern.

Das erscheint mir idiotisch - warum nicht einfach auto-increment auf dem Indexfeld verwenden? Ich habe es auf beide Arten getestet, und das Hinzufügen von Zeilen zur Tabelle ohne Angabe einer Index-ID ist (offensichtlich) um ein Vielfaches schneller. Meine Frage ist: Kann irgendjemand irgendeinen Grund denken, warum der ursprüngliche Programmierer das getan haben könnte? Gibt es eine Denkrichtung, in der auto_increment irgendwie als schlechte Form angesehen wird? Gibt es Datenbanken, die keine Autoinkrement-Funktionen haben?

    
goldenapples 23.11.2010, 21:12
quelle

8 Antworten

8

Ich habe das schon mal von jemandem gesehen, der nicht wusste, dass dieses Feature existiert. Verwenden Sie unbedingt die Auto-Inkrement-Funktion.

Manche Leute nehmen den "roll your own" -Ansatz für alles an, oft weil sie sich nicht die Zeit genommen haben, um zu sehen, ob das ein verfügbares Feature ist oder ob es jemand anderes schon gemacht hat. Sie werden oft verrückte Workarounds oder schlechte Performing / fragile Code von diesen Leuten sehen. Eine schlechte Datenbank zu vererben ist überhaupt kein Spaß, viel Glück!

    
theChrisKent 23.11.2010, 21:16
quelle
5

Nun, Oracle hat Sequenzen, aber nicht automatisch generierte IDs, wie ich es verstehe. In der Regel werden diese Dinge von Entwicklern erledigt, die die Datenbankprogrammierung nicht verstehen und die Lücken in den Daten nicht sehen wollen (wie es bei Rollbacks der Fall ist). Es gibt auch Leute, die gerne die ID erstellen, so dass sie sie früher für Kindtabellen verfügbar haben, aber die meisten Datenbanken mit automatisch generierten IDs haben auch eine Möglichkeit, diese ID zum Zeitpunkt der Erstellung an den Benutzer zurückzugeben.

    
HLGEM 23.11.2010 21:17
quelle
3

Das einzige Problem, das ich teilweise (aber absolut vermeidbar!) gegenüber auto_inc-Feldern fand, ist, dass einige Sicherungstools standardmäßig auto_inc-Werte in die Tabellendefinition einschließen, auch wenn Sie keine Daten in einen DB-Dump einschließen, die unbequem sein könnten.

    
a1ex07 23.11.2010 21:22
quelle
3

Abhängig von der konkreten Situation gibt es viele Gründe, keine fortlaufenden Nummern als Primärschlüssel zu verwenden.

Unter der Voraussetzung, dass ich aufeinanderfolgende Zahlen als Primärschlüssel möchte, sehe ich keinen Grund, die eingebaute Funktion auto_increment , die MySQL anbietet, nicht zu verwenden

    
Riedsio 23.11.2010 21:39
quelle
1

Es wurde wahrscheinlich aus historischen Gründen so gemacht; d. h. frühere Versionen hatten keine Autoinc-Variablen. Ich habe Code geschrieben, der manuelle Autoinc-Felder für Datenbanken verwendet, die Autoinc-Typen nicht unterstützen, aber mein Code war nicht ganz so ineffizient wie das Ziehen eines count ().

Ein Problem bei der Verwendung von autoinc-Feldern als Primärschlüssel besteht darin, dass das Verschieben von Datensätzen in Tabellen und aus Tabellen dazu führen kann, dass sich der Primärschlüssel ändert. Daher würde ich empfehlen, in einem "LegacyID" -Feld zu entwerfen, das als zukünftiger Speicher für den Primärschlüssel für Zeiten verwendet werden kann, wenn Sie Datensätze innerhalb und außerhalb der Tabelle verschieben.

    
Kluge 23.11.2010 21:20
quelle
1

Sie waren vielleicht nur unerfahren und mit der automatischen Erhöhung nicht vertraut. Ein Grund, den ich mir vorstellen kann, aber nicht unbedingt viel Sinn ergibt, ist, dass es schwierig (nicht unmöglich) ist, Daten von einer Umgebung in eine andere zu kopieren, wenn man Autoinkrement-IDs verwendet.

Aus diesem Grund habe ich zuvor sequenzielle Guids als meinen Primärschlüssel verwendet, um den Übergang von Daten zu erleichtern, aber das Zählen der Zeilen zum Auffüllen der ID ist ein bisschen WTF .

    
Josh 23.11.2010 21:18
quelle
1

Zwei Dinge, auf die Sie achten sollten:

1. Ihr RDBMS legt beim Neustart automatisch den Wert für die automatische Erhöhung fest. Unsere Ingenieure rollten ihre eigene Auto-Inkrement-Taste, um das Auto-Inkrement-Feldspringen bei jedem Neustart des Servers in einer Größenordnung von 100000s zu umgehen. Irgendwann hat Sybase jedoch eine Option hinzugefügt, um die Größe des Autoinkrements festzulegen.

2. Wenn Sie Datenbanken replizieren und eine Master-Master-Konfiguration verwenden, ist der andere Ort, an dem Auto-Increment unangenehm werden kann. Wenn Sie auf beide Datenbanken schreiben (NICHT EMPFOHLEN), können Sie auf Identitätskollision stoßen.

Ich bezweifle, dass einer dieser Fälle der Fall war, aber Dinge, auf die ich achten sollte.

    
Kris Robison 23.11.2010 22:20
quelle
0

Ich konnte sehen, ob die IDs auf dem Client generiert und in die Datenbank übertragen wurden. Dies ist üblich, wenn Geschwindigkeit erforderlich ist, aber das, was Sie beschrieben haben, erscheint übertrieben und unnötig. Entfernen Sie es und starten Sie eine automatisch inkrementierende ID.

    
Khalid Abuhakmeh 23.11.2010 21:19
quelle

Tags und Links