2009-04-16 11 views
2

Autonummer Felder (z. B. "Identität" in SQL Server) sind eine gängige Methode zum Bereitstellen eines eindeutigen Schlüssels für eine Datenbanktabelle. In Anbetracht der Tatsache, dass sie ziemlich häufig sind, werden wir in Zukunft mit dem Problem zu tun haben, wo sie ihren maximalen Wert erreichen werden.Strategie für die Bewältigung von Datenbankidentität/Autonummer maxing

Kennt jemand oder haben Sie eine empfohlene Strategie, um dieses Szenario zu vermeiden? Ich erwarte, dass viele Antworten vorschlagen, zu Guids zu wechseln, aber da dies eine große Menge an Entwicklung erfordert (besonders dort, wo viele Systeme integriert sind und den Wert teilen) gibt es einen anderen Weg? Gehen wir in eine Richtung, in der neuere Hardware/Betriebssysteme/Datenbanken einfach immer größere Werte für Ganzzahlen zulassen?

Antwort

11

Wenn Sie wirklich erwarten, dass Ihre IDs leer sind, verwenden Sie bigint. Für die meisten praktischen Zwecke wird es nie ausgehen, und wenn dies der Fall ist, sollten Sie wahrscheinlich eine uniqueidentifier verwenden.

Wenn Sie (das bedeutet eine Transaktion/Zyklus auf einem 3,0 GHz-Prozessor) Transaktionen pro Sekunde, es geht um ein Jahrhundert für bigint nehmen würde auslaufen zu lassen (auch wenn Sie ein wenig beiseite legen für die Schild).

Das heißt, einmal: „640K ought to be enough for anybody.“ :)

+2

+1 für das 640k Zitat –

+1

In der Tat ist es nicht wirklich das gleiche Problem. 640K war eine Rechenbeschränkung und dies ist eine logische Einschränkung in der realen Welt. Zu dieser Zeit gab es offensichtlich viel mehr als 640.000 Daten. –

+0

Warum nicht Guid? 64Bits könnten die nächsten 640K sein ... – Paco

0

Gibt es eine Möglichkeit, durch die Nummern zu Zyklus, der aus der Datenbank gelöscht wurden? Oder sind die meisten Aufzeichnungen noch am Leben? Nur ein Gedanke.

Meine andere Idee war, Mehrdad Vorschlag des Umschaltens

0

Identitätsspalten werden normalerweise auf 1 gesetzt und um +1 erhöht. Negative Werte sind ebenso gültig wie positiv und verdoppeln damit den Pool verfügbarer Identifikatoren.

+0

Ja, und wenn Sie bigint verwenden, das würde Sie 30 Millionen Jahre mehr bekommen :) –

+0

Wir hatten Prozesse, die häufig große Datenmengen (Stichproben Daten) neu geladen und generiert jedesmal neue Kennungen Wir sind nicht in Gefahr, das Limit zu erreichen, aber ich kann sehen, wie es möglich ist. –

0

Wenn Sie möglicherweise so große Datenmengen erhalten, dass Ihre IDs maximal sind, möchten Sie möglicherweise auch Unterstützung für die Replikation, damit Sie mehrere synchronisierte Instanzen Ihrer Datenbank haben können. Für solche Fälle und für Fälle, in denen Sie "erratbare" IDs (Web-Anwendungen usw.) vermeiden möchten, würde ich Guids (Uniqueneidentifiers) mit einem Standard eines neuen Guid als Ersatz für Identitätsspalten vorschlagen.

Da Guids eindeutig sind, können Daten ordnungsgemäß synchronisiert werden, auch wenn Datensätze gleichzeitig zum System hinzugefügt wurden.