Ich bin dabei, eine neue Datenbank zu entwerfen, die die Replikation unterstützen muss, und ich bleibe bei der Entscheidung, was ich als Primärschlüssel wählen soll.
In unserer aktuellen Datenbank für Primärschlüssel verwenden wir zwei int-Spalten, die erste Spalte ist identity und die andere wird verwendet, um zu beschreiben, auf welchem Server die Zeile eingefügt wird. Jetzt möchte ich vermeiden, zwei Spalten für den Primärschlüssel zu verwenden, und stattdessen nur eine Spalte verwenden. Bisher habe ich zwei Möglichkeiten, dies zu tun:
Verwenden Sie GUID für meinen Primärschlüssel
Dieser stellt sicher, dass es immer einen eindeutigen Schlüssel für eine beliebige Anzahl von Servern gibt. Was ich nicht mag, ist, dass die GUID 16 Bytes groß ist, und wenn sie für den Fremdschlüssel über viele Tabellen verwendet wird, wird Platz verschwendet. Außerdem ist es schwieriger, es beim Schreiben von Abfragen zu verwenden, und es wird langsamer abgefragt.
Verwenden Sie int oder bigint, und geben Sie für jede Tabelle auf jedem Server manuell den Start- und Inkrementwert an. Wenn beispielsweise zwei Server vorhanden sind, beginnt die X-Tabelle auf dem ersten Server mit der Nummer 1, und auf dem zweiten Server beginnt sie mit der Nummer 2, jede wird um 2 erhöht. Es wäre also (1,3,5 ,. ..) am ersten und (2,4,6, ...) am zweiten Server. Das Gute an diesem Design ist, dass es beim Schreiben von Abfragen einfacher zu verwenden ist, schneller ist und weniger Platz für Fremdschlüssel benötigt. Schlimm ist, dass wir nie wissen, wie viele Server laufen werden, so dass es schwieriger ist zu sagen, was der Inkrementwert sein wird. Außerdem ist es schwieriger, die Schemaänderung auf dem Server zu verwalten.
Was ist die beste Vorgehensweise für die Verwaltung mehrerer Server und was ist der beste Weg, wenn überhaupt, in Situationen dieser Art?
Ihre Frage ist eine gute und oft gestellte Frage.
Von einer Wartungsperspektive würde ich absolut mit GUIDS gehen. Sie sind aus einem bestimmten Grund da. Irgendwo entlang der Linie können Sie in komplexe Operationen geraten, die Ihre Daten verschieben und re-replizieren, und dann können die anderen Optionen ein wenig komplexer werden, als es sein muss.
Es gibt einen sehr schönen Kurzbericht über die verschiedenen Optionen hier:
Wie für den Replikationsteil - wenn richtig gemacht, gibt es keine wirklichen Kopfschmerzen mit der Replikation.
Aktualisierung:
Eine einfachere / manuelle Methode gefunden hier . Umfasst die Verwendung von NOT FOR REPLICATION und Staffelung von Identitäts-Startwerten, wie Sie in Kommentare.
Original:
Ihre beste Wette ist so etwas wie die zweite gelistete Option. Weisen Sie Identitätsbereiche für die Replikationsherausgeber- und Abonnenteninstanzen zu und aktivieren Sie die automatische Bereichsverwaltung.
In diesem Artikel werden die Optionen zum Verwalten von Identitätsspalten in der Replikation und Aktivierung der Identitätsbereichsverwaltung wird hier besprochen.
Da Sie nicht wissen, wie viele Server sich im Replikationspool befinden, müssen Sie Artikeleigenschaften möglicherweise regelmäßig neu konfigurieren.
Ich wage es, gegen die Replikation insgesamt zu raten :) es ist sicherlich mehr Schmerz als Spaß. Wenn Sie es sich leisten können, schauen Sie in das Sync-Framework .
Das Spielen mit Identität ist nicht gelinde gesagt flexibel. Ziehen Sie in Erwägung, bewegliche Server hinzuzufügen. Identity einfügen, verschiedene Schemata und so weiter.
GUID wäre für einen gruppierten Schlüssel in Ordnung, wenn Sie newsequentialid () als Standardwert verwenden würden. Es ist ein bisschen größer (eine Anzahl von Bits), aber es löst den Aufwand einmal und für immer:)
Ich würde einen int-Identitätsclusterschlüssel verwenden, der nur für den Datenbankkontext relevant ist. Fügen Sie dann eine GUID-Spalte hinzu, die für den Synchronisationskontext von Bedeutung ist. Ergänzen Sie es mit einer Rowversion-Spalte, um zu sehen, was für die Synchronisierung bereit ist.
Tags und Links sql-server primary-key identity