Freigeben über


Auswählen eines geeigneten Primärschlüssels für eine verteilte Umgebung

Bei Tabellen, die an inkrementellen Synchronisierungen teilnehmen, verlangt Sync Framework, dass jede Zeile eindeutig identifiziert wird. Bei Client- und Server-Momentaufnahmensynchronisierungen ist dies nicht erforderlich. In der Regel werden Zeilen durch einen Primärschlüssel identifiziert, der in der Server- oder Peerdatenbank definiert ist. In verteilten Umgebungen müssen Sie bei der Auswahl des Spaltentyps, der als Primärschlüssel verwendet werden soll, besonders vorsichtig sein. Die Primärschlüssel müssen für alle Knoten eindeutig sein und dürfen nicht wiederverwendet werden. Wenn eine Zeile gelöscht wird, darf der Primärschlüssel dieser Zeile nicht für eine andere Zeile verwendet werden. Wenn ein Primärschlüssel von mehr als einem Knoten verwendet wird, kann ein Primärschlüsselkonflikt auftreten. Dies tritt in allen verteilten Umgebungen auf und ist keine Einschränkung von Sync Framework. In diesem Thema werden die Möglichkeiten beschrieben, zwischen denen Sie bei den Primärschlüsseln wählen können, und Sie finden hier Angaben dazu, inwiefern sich die einzelnen Möglichkeiten für verteilte Umgebungen eignen.

(Identitäts-)Spalten mit automatischer Inkrementierung

Datenbankarchitekten verwenden als Primärschlüssel häufig Spalten mit automatischer Inkrementierung. Diese Eigenschaft (in SQL Server die IDENTITY-Eigenschaft) generiert für jeden Datensatz, der in eine Tabelle eingefügt wird, einen neuen Wert. Dazu wird der aktuelle Wert (Ausgangswert oder Seedwert) um einen festen Betrag (Inkrement) erhöht oder verringert, und das Ergebnis wird der Zeile zugewiesen, die eingefügt wird. Spalten mit automatischer Inkrementierung verwenden in der Regel kompakte Datentypen, z. B. ganze Zahlen. Dies kann bei Abfragen der zugrunde liegenden Tabelle zu einem kompakteren gruppierten Index, effizienteren Joins und geringerem EA-Verkehr führen.

Da die Ausgangswert- und Inkrementeigenschaften jedoch fest sind und aus einer unbegrenzten Anzahl möglicher Werte ausgewählt werden können, ist die Wahrscheinlichkeit eines Primärschlüsselkonflikts sehr hoch. Dieser Schlüsseltyp eignet sich für Datencachingszenarien, bei denen lediglich ein Download erfolgt. In diesen Szenarien sollte der Server oder ein ausgewählter Peer der einzige Knoten sein, der neue Primärschlüsselwerte generiert. Auf diese Weise wird sichergestellt, dass diese Werte über alle Knoten in der Topologie hinweg eindeutig sind. Spalten mit automatischer Inkrementierung eignen sich auch für Szenarien mit Nur-Upload- und bidirektionaler Synchronisierung, sofern die Einfügevorgänge nur an einem Knoten erfolgen. In diesen Szenarien erfolgen Einfügevorgänge in der Regel nur auf dem Server oder einem ausgewählten Peer, während Aktualisierungsvorgänge und etwaige Löschvorgänge auf einem oder mehreren Clients stattfinden. Wenn Einfügevorgänge an mehreren Knoten erforderlich sind, sollten Sie sich für eine der weiter unten beschriebenen Möglichkeiten entscheiden.

GUIDs

Die Verwendung einer GUID (eine uniqueidentifier-Spalte in SQL Server) als Primärschlüssel garantiert Eindeutigkeit über eine unbegrenzte Anzahl von Knoten hinweg und eliminiert die Primärschlüsselkonflikte, zu denen es bei Spalten mit automatischer Inkrementierung kommen kann. Bei Verwendung einer GUID im Primärschlüssel ist jedoch Folgendes zu beachten:

  • Aufgrund des großen Datentyps (16 Bytes) erhöht sich die Größe des gruppierten Index, was sich negativ auf häufige Vorgänge, z. B. Joins, auswirken kann.

  • Die ungeordnete Generierung von GUIDs bewirkt, dass Zeilen in zufällige Positionen im gruppierten Index eingefügt werden. Dies kann wiederum einen fragmentierten gruppierten Index zur Folge haben. Dadurch kann der EA-Verkehr beeinträchtigt werden, der für die Abfrage der zugrunde liegenden Tabelle erforderlich ist.

    In SQL Server 2005 und höheren Versionen können Sie die NEWSEQUENTIALID()-Funktion verwenden, um fortlaufende GUIDs zu generieren und so für ein wenig mehr Ordnung zu sorgen.

Schlüssel, die eine Knoten-ID enthalten

Bei dieser Herangehensweise kommt ein Schlüssel zum Einsatz, der einen auf dem Server oder am Clientknoten eindeutigen Wert mit einem Wert kombiniert, der in der gesamten Topologie eindeutig ist. So könnten Sie z. B. bei der Client- und Serversynchronisierung eine Spalte mit automatischer Inkrementierung (am Knoten eindeutig) mit einer Spalte kombinieren, die einen Hash der ID speichert, die Sync Framework jedem einzelnen Client zuweist (die ClientId, die in der gesamten Topologie eindeutig ist). Anschließend könnten Sie einen zusammengesetzten Primärschlüssel aus diesen beiden Spalten erstellen. Stattdessen könnten Sie auch ein System zum Generieren von Werten für jede eingefügte Zeile entwickeln, sodass Sie die Zeilen-ID und die Client-ID in derselben Spalte zusammenführen.

Natürliche Schlüssel

Bei dieser Strategie wird kein künstlich hergestellter Schlüssel, sondern ein Geschäftsschlüssel verwendet, um Datensätze eindeutig zu kennzeichnen. So könnte z. B. eine Tabelle, in der Kundendaten gespeichert werden, statt einer Identitätsspalte die Spalte mit der Sozialversicherungsnummer als Primärschlüssel verwenden. Der Nachteil dieser Herangehensweise besteht darin, dass der Primärschlüssel groß werden könnte, wenn für die eindeutige Identifizierung eines Datensatzes mehrere Spalten benötigt werden. Außerdem muss dieser zusammengesetzte Schlüssel an andere Tabellen weitergegeben werden, damit Fremdschlüsselbeziehungen unterstützt werden. Diese Beziehungen wiederum wirken sich negativ auf die Joinleistung aus.

Onlineeinfügung

Wenn sich keine der oben vorgeschlagenen Lösungen eignet und bei Ihrem Szenario nur einige wenige Einfügevorgänge bei einem Client erforderlich sind, könnte es sich für die Anwendung anbieten, diese Zeilen direkt auf dem Server einzufügen. Die neuen Zeilen werden dann während der nächsten Synchronisierung heruntergeladen und beim Client eingefügt. Da die Primärschlüsselwerte auf dem Server generiert werden, treten keine Primärschlüsselkonflikte auf.

Siehe auch

Konzepte

Überlegungen zum Entwurf und zur Bereitstellung von Anwendungen