Ich bin mitten in einer Debatte darüber, ob es besser ist, eine zu machen PRIMARY KEY
aus einer Identitätsspalte eine aus einer UDF zu machen, die explizit eine eindeutige ID generiert.
- Ich argumentiere für die Identitätsspalte.
- Mein Partner plädiert dafür, die Werte manuell zu generieren, behauptet er
- indem wir die UDF auf einen anderen Tisch legen, an dem wir eine UDF haben können
- Sperren Sie die Ressource
- Inkrementieren Sie eine ID-Tabelle mit einem aufgerufenen Feld
ID_Value
von wird1
- Verwenden Sie dies als globale eindeutige Kennung
- Oder lassen Sie den Tisch eine machen
id+1
beim Einfügen ausführen - Dass es einfacher ist, Daten zwischen Servern und / oder Umgebungen zu verschieben, für die keine Identifizierungsbeschränkung besteht. Verschieben von einer Datenbank, in der Daten vorhanden sind, in eine andere ähnliche Datenbank mit beispielsweise Staging- oder Dummy-Daten. Für Tests in der Nichtproduktion möchten wir möglicherweise alle Datensätze von gestern bis zum Staging zum Testen herunterziehen.
- indem wir die UDF auf einen anderen Tisch legen, an dem wir eine UDF haben können
Welche Implementierung ist sinnvoller?
Die Identitätsspalte klingt für mich gut. Ich bin nicht sicher, ob ich der Logik folge, warum es schwierig ist, Daten zwischen Servern zu verschieben.
Wenn Sie möchten, dass jede Zeile eine global eindeutige Identität hat, können Sie eine UUID verwenden, aber ich würde dies nicht tun, es sei denn, Sie sind sicher, dass die globale Eindeutigkeit erforderlich ist - normalerweise nicht. Die Verwendung von UUIDs als IDs verringert die Leistung, erhöht den Speicherplatzbedarf und erschwert das Debuggen. Aufgrund der Länge ist es schwierig, sich eine UUID zu merken, sie jemandem über das Telefon mitzuteilen oder sie fehlerfrei auf Papier zu schreiben.
quelle
Für einfache numerische IDs gehen Sie einfach mit Identität und vergessen Sie alle Probleme, sie manuell zu generieren.
Sie können jederzeit eine "Supertabelle" erstellen, die eine Identität als PK verwendet und über eine Typspalte sowie andere Informationen verfügt. Wenn Sie eine neue ID benötigen (vorausgesetzt, Sie meinen eindeutige IDS für verschiedene Tabellen), fügen Sie diese einfach in diese Tabelle ein und greifen Sie auf die zu
SCOPE_IDENTITY()
und fügen Sie sie dann in die tatsächliche Tabelle ein, die Sie benötigen.Grundsätzlich erstellen Sie eine Tabelle: MasterIDs mit einer Identitäts-PK, wenn Sie eine Zeile in Ihre Tabelle1 einfügen müssen,
INSERT INTO MasterIDs
und erhalten die von dieser Zeile generierte Identität mithilfe vonSCOPE_IDENTITY()
und fügen sie dann mit diesem Wert als PK in Tabelle1 ein .Tabelle 1 hat eine Nichtidentität int PK. Sie würden den gleichen Vorgang zum Einfügen in Tabelle 2 usw. ausführen. Lassen Sie SQL Server die Identitätswerte in der MasterIDs- Tabelle verwalten, die Sie dann in Ihren anderen Tabellen verwenden können. MasterIDs können andere Tabellen enthalten, z. B. type (damit Sie wissen, welche Tabelle, Tabelle1 oder Tabelle2 usw. diesen Identitätswert verwendet.
quelle
Solange Sie Fremdschlüsseleinschränkungen ordnungsgemäß verwenden (Kaskadierung, Aktualisierung usw.), können Sie problemlos ein Identitätsfeld verwenden. Ich sehe in diesem Fall wirklich keinen Vorteil gegenüber der anderen Lösung.
quelle
Die Identität wurde passend zu Ihrem Szenario erstellt. Sie haben Tools wie die Replikation für den Datenaustausch zwischen Server und Umgebung, die alles zusammenhalten.
quelle
Ich habe gerade eine Arbeit beendet, bei der ich eine SQL Server-
identity
Spalte durch ein normalesint
Feld ersetzt und die ID-Zuweisung selbst gesteuert habe.Ich habe ziemlich beeindruckende Leistungssteigerungen gesehen. Im Gegensatz zum OP habe ich keine UDF, um die ID zu generieren. Das Prinzip ist jedoch ziemlich dasselbe: Es gibt einen Teil der Software, der einen Pool von IDs verwaltet. Wenn sie leer sind, wird ein weiterer Stapel abgerufen, indem die Datenbank nach dem nächsten niedrigen Wert abgefragt und auf den nächsten hohen Wert erhöht wird .
Auf diese Weise können wir IDs generieren und alle Entitäten außerhalb einer Transaktion in unserem ORM verknüpfen, bevor wir die Stapel an die Datenbank senden. Außerdem können wir größere Stapel ohne zusätzliche Roundtrips senden, um die gerade eingefügte Identität zu erhalten (erforderlich für Identitätsspalten).
In der ID-Tabelle gibt es mehr als eine Zeile, sodass wir auf Wunsch bestimmte Bereiche verwenden können. dh zur Wiederverwendung gelöschter Blöcke und negativer IDs.
quelle
Ich benutze Identität seit Jahren und denke ernsthaft darüber nach, die Identitätsnummer durch UNIQUEIDENTIFIER zu ersetzen. Es ist ein Albtraum, wenn Sie den Datentyp ändern müssen, wenn jemand ihn als kompakte Datenbank konzipiert hat, und ein Albtraum, wenn Sie einer Spalte Identität hinzufügen müssen. Außerdem können Sie die Identitätsspalte nicht aktualisieren. Stellen Sie sich vor, Sie geben ein int ein und Ihre Datenbank wächst über 2 Milliarden Datensätze hinaus, was wiederum ein Albtraum ist (FKs berücksichtigen)! Etwas mit Identität zu ändern ist ein Albtraum und nicht skalierungsfreundlich, es sei denn, Sie setzen Bigint! UNIQUEIDENTIFIER vs Identity = Bequemlichkeit und Robustheit vs möglicherweise spürbare Leistungsverbesserung (hat den Benchmark nicht erreicht).
Update: Nachdem ich gesehen habe das lehne ich mich auf jeden Fall in Richtung UNIQUE. Dies zeigt keinen wirklichen Vorteil der Bigint-Identität und eine Reihe von Vorteilen für UNIQUEIDENTIFIER! Unterschiedliche Versionen von SQL Server können zu unterschiedlichen Ergebnissen führen. Es ist einfach schön, eine eindeutige ID für alle Datenbanken und Systeme zu haben (Robustheit)! Verschieben, kopieren, transformieren Sie Daten nach Belieben! https://www.mssqltips.com/sqlservertip/5105/sql-server-performance-comparison-int-versus-guid/
quelle