2009-08-07 22 views
2

Eine Voraussetzung ist, dass wenn ich meine C# -Objekte für die Datenbank beibehalten muss ich die Datenbank-ID (Ersatz-Primärschlüssel) im Code entscheiden muss.Generieren eindeutiger Datenbank-IDs in Code

Zweite Voraussetzung ist, dass der Datenbanktyp für den Schlüssel int oder char (x) sein muss ... also keine uniqueidentifier oder binary (16) oder dergleichen.

Dies sind unveränderliche Anforderungen.

Was wäre der beste Weg, um damit umzugehen?

Eine Idee sind die Base64 codierten GUIDs, die wie "XSiZtdXcKU68QWe7N96Dig" aussehen. Diese werden einfach im Code erstellt und sind für mich bei URLs akzeptabel. Aber wird es in Bezug auf die Leistung (Indexierung, Größe) zu teuer sein, dass alle Primär- und Fremdschlüssel char (22) sind? Aus der Hand mag ich diese Idee wirklich.

Eine andere Idee wäre, eine Code-Version einer Datenbank-Sequenz zu erstellen, die inkrementelle Ganzzahlen für mich erstellt. Aber ich weiß nicht, ob das plausibel ist und würde eine Anleitung brauchen, um die Zuverlässigkeit zu sichern. Der Sequenzer muss wissen, wie weit er gekommen ist, und was ist mit Threads, die ich nicht kontrolliere usw.

Ich kann mir vorstellen, dass keine Tabelle mehr als 1.000.000 Zeilen umfasst ... wird wahrscheinlich weit weniger sein.

+1

Das macht wirklich keinen Sinn - das ist wirklich die Aufgabe der Datenbank, warum versuchen Sie, das auf den Client-Code zu verschieben? Jeder Client-Code wird fehleranfällig sein (mögliche Duplikate) - nur die Datenbank kann wirklich die Eindeutigkeit garantieren –

+3

Kann ich Sie bitten zu klären, warum die Anforderung ist, über die eindeutige ID im Code zu entscheiden? In neun von zehn Fällen habe ich festgestellt, dass die Lösung dieses Problems darin besteht, diese Anforderung zu umgehen und die Datenbank einfach arbeiten zu lassen. –

+1

Ich kenne alle Diskussionen und habe keinen Drang zu rechtfertigen :). Ich stelle eine Frage basierend auf den genannten unveränderlichen Anforderungen, um entsprechend zu antworten. – lox

Antwort

0

Ein einfaches Inkrementieren von int wäre der einfachste Weg, die Eindeutigkeit sicherzustellen. Dies ist, was die Datenbank tun wird, wenn Sie es zulassen. Wenn Sie die Tabellenzeile auf auto_increment setzen, wird dies automatisch von der Datenbank erledigt.

Es gibt keine Sicherheitsprobleme, aber da Sie es selbst behandeln, anstatt sich von der Datenbank-Engine kümmern zu lassen, müssen Sie sicherstellen, dass Sie dieselbe ID nicht zweimal generieren. Dies sollte einfach sein, wenn Sie auf einem Single-Thread-System sind, aber wenn Ihr Programm verteilt ist, müssen Sie einige Anstrengungen unternehmen, um die Einzigartigkeit sicherzustellen.

0

Sehen, dass Sie eine ASP.NET-App haben, können Sie folgendes tun (in der Hoffnung und alle Benutzer unter der Annahme, müssen sich authentifizieren, bevor Ihre App!):

  • Assign jeder Benutzer eine eindeutige „UserID“ in Ihre Datenbank (kann INT oder CHAR sein)
  • jeden Benutzer zuordnen eine „HighestSequentialID“ (INT) in Ihrer Datenbank
  • Wenn sich der Benutzer anmeldet, diese Werte aus der Datenbank gelesen und speichern sie in zB ein benutzerdefinierter Prinzipal, oder in einem Cookie, oder etwas anderes
  • wenn der Benutzer gerade eine Zeile einfügen möchte, erstellen Sie eine segmentierte ID: (UserID). (Benutzer sequentielle Nummer) und speichern Sie es als "VARCHAR (20)" - z.B Ihre Benutzer-ID ist 15 und somit hätten die Einträge dieses Benutzers eindeutige IDs von "15.00001", "15.00002" und so weiter.
  • , wenn der Benutzer (oder zu einem anderen Zeitpunkt) abmeldet, aktualisiert ihre neue, höchsten verwendete sequentielle ID in der Datenbank, so dass beim nächsten Mal, werden Sie um wissen, was die Nutzer

Wieder zuletzt verwendet hat - Sie müssen viel mehr Hausarbeit selbst erledigen, und es ist immer anfällig für ein Missgeschick (Zuweisung einer doppelten Benutzer-ID oder Fehlinterpretation der höchsten fortlaufenden Nummer für diesen Benutzer).

Ich würde dringend empfehlen zu versuchen, diese Anforderungen zu ändern - mit diesen vor Ort, alle Lösungen werden bestenfalls sub-optimal, während die Verwendung der Datenbank, um dies zu handhaben wäre völlig schmerzlos.

Marc

1

Sie eine Tabelle "Sequenzen" genannt haben könnte. Für jeden Tisch gab es eine Reihe mit einem Zähler. Wenn Sie dann eine andere Nummer benötigen, holen Sie sie von der Zählertabelle und inkrementieren Sie sie. Setzen Sie es in eine Transaktion und Sie werden Einzigartigkeit haben.

Allerdings wird dies in Bezug auf die Leistung natürlich leiden.

+0

Und das ist wieder in der Datenbank - die nach dem OP, kann er nicht berühren, wenn die eindeutigen IDs erstellen .... –

+0

Ah, nun ... dann nicht, denke ich. : P –

0

Für eine Tabelle unter 1.000.000 Zeilen, wäre ich nicht allzu besorgt über eine Char (22) Primärschlüssel. Natürlich wäre die ideale Lösung für eine Situation wie diese, dass jedes Objekt etwas Einzigartiges besitzt, das Sie für den Schlüssel nutzen könnten, selbst wenn es ein mehrteiliger Schlüssel ist. Die nächste ideale Lösung wäre, die Anforderungen geändert zu haben :)

Verwandte Themen