Laden...

Datenbank-Sychronisation

Erstellt von M@TUK vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.861 Views
M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 12 Jahren
Datenbank-Sychronisation

verwendetes Datenbanksystem: MS-SQL 2008 r2 express

Hi,

ich mach mir jetzt schon seit Tagen Gedanken darüber wie ich mein Problem lösen soll, aber ich komm irgendwie auf keinen grünen Zweig...

Eventuell könnt ihr mir ja etwas weiterhelfen.

Nehmen wir mal an es gibt eine Applikation mit einer Datenbank. Diese Applikation (ink. DB) ist an mehreren Standorten installiert. Die Datenbanken (X1 bis Xn) haben die exakt selbe Struktur.

Nun soll es eine "andere" Applikation mit eigener Datenbank (Y) geben. In diese Datenbank sollen bestimmte Tabellen aus den anderen Datenbank repliziert werden. Ich muss also die Daten aus mehreren strukturell identischen externen Tabellen in eine Tabelle zusammenfassen.

Beispiel:

Tabelle "Customer":
CustomerId
Firstname
Lastname

Tabelle "CustomerAddress":
CustomerAddressId
CustomerId
Street
Zipcode
City

Customer <=> CustomerAddress haben eine 1:n-Beziehung.

Problem 1 ist hier dass die Kunden in der Datenbank X1 mit ziemlicher Sicherheit die selben Ids haben wie in der Datenbank X2,X3,X4,...
und deswegen beim Import ein Insert der ID nicht funktioniert. Es muss also eine neue Id "generiert" werden und ich verliere die Ursprungs-Id.

Problem 2 ist dass die replizierten Daten aber updatefähig bleiben sollen. Die Daten der replizierten Tabellen werden in der DB Y NICHT bearbeitet. Es soll aber möglich sein die Daten ein weiteres mal zu replizieren und da sollen dann neue hinzugefügt und bestehende upgedatet werden.

Ich hab mir schon 2 Lösungsvarianten ausgedacht aber ich bin mir nicht sicher ob die wirklich so gut sind. Die beiden Beispieltabellen sind ja nur zur Darstellung im Endeffekt werden es ~12-15 Tabellen sein die alle Beziehungen haben.

Variante 1:

Die zu replizierenden Tabellen in Datenbank Y erhalten ein zusätzliches Feld "ExternalId" in das die Ursprungs-Id geschrieben wird. Ich befürchte dann aber, dass ich beim Import extrem viele geschachtelte Schleifen und einzelne Datenbank-Zugriffe auf die Ursprungsdatenbank haben werde.

Variante 2:

In den Datenbanken X1-Xn werden die "autoimcrement" Ids gegen GUIDs ausgetauscht. Damit wäre die "Ids" unique und ich könnte die einzelnen Tabellendaten "relativ" einfach replizieren und wäre updatefähig.
Wie ist das aber mit der Performance, ich hab gelesen dass GUIDs im Gegensatz zu int-Ids viel langsamer wären. Wir sprechen hier von ein paar 10.000 Datensätzen pro Datenbank-Tabelle und nicht von Millionen. Ich müsste aber die Ursprungs-Applikationen und die Datenbanken komplett umbauen. Die Applikation selber wäre nicht das Problem aber dass es bereits Daten gibt und ich nicht weiss ob das Umstellen auf GUIDs dann so einfach geht.

Gibt es sonst noch Ansätze wie man sowas realisieren könnte?

thx,
lg

S
24 Beiträge seit 2011
vor 12 Jahren

so ganz verstehe ich deine problematik nicht, aber im bezug auf die möglicherweise nicht eindeutigen customids - kannst du ja beim import in die "zentrale" db einfach ein festes suffix für x1 ..xn vorranstellen. vllt einfach den wertebereich in der zentralen db hochschrauben und dann plus rechnen, das sollte schnell sein, rückwärts eben minus 😃

M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 12 Jahren

hi...

also einfach zu den Ids der Ursprungsshops beim Import einen "Faktor" addieren...

damit hätte dann jede Ursprungsdatenbank ihren eigenen "Id-Bereich"

X1 => 1000000
X2 => 2000000
X3 => 3000000
usw.

Ds gefällt mir eigentlich sehr gut.. weil da brauch ich weder an der Applikation noch an der Datenbank-Struktur was verändern.

Und mit 999999 Ids pro Datenbank komm ich sowas von locker aus.

Spricht irgendwas gegen so eine Lösung?

lg

F
10.010 Beiträge seit 2004
vor 12 Jahren

Und warum benutzt du nicht Sync Framework

1.564 Beiträge seit 2007
vor 12 Jahren

Hallo

Möglichkeit 1:
(Jetzt war FZelle schneller mit dem ersten Teil meiner Antwort..)

Möglichkeit 2:
Verwende in deiner Y Datenbank einen zusammengesetzten PK aus der X1..XN ID und einer zusätzlichen Spalte welche den Standort qualifiziert, das ist recht easy. Ich würde keine ID-Ranges verwenden. Erstens weiß man nie was noch an Daten kommt und zweitens würde das voraussetzen dass deine bestehenden Daten in allen Standorten angepasst werden müssen um erstmal in ihren Range zu kommen.

beim Import extrem viele geschachtelte Schleifen

Dann ist dein Import falsch konzipiert.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 12 Jahren

Hi...

kann ich mit dem Sync-Framework das problem mit den Ids lösen bzw. umgehen? Hat sowas schonmal eine von euch gemacht?

Das mit der Range hätt mir schon gut gefallen.
Die Menge der Datensätze wir maximal im hohen 5stelligen (max. Anfang 6stelligen) Bereich liegen.

Und die Daten müssten doch nicht angepasst werden, ich brauch beim Import ja immer nur den Faktor dazuzählen....

Mit dem PK aus zwei Spalten müsste ich aber auch die zentrale Datenbank umbauen...

lg

M
24 Beiträge seit 2006
vor 12 Jahren

Hallo,
nur als kleiner Input: absolut eindeutige primary keys erhält man auch, wenn man dafür eine GUID verwendet ("...eindeutig in Zeit und Raum..." 😃

C
1.214 Beiträge seit 2006
vor 12 Jahren

Hallo,
nur als kleiner Input: absolut eindeutige primary keys erhält man auch, wenn man dafür eine GUID verwendet ("...eindeutig in Zeit und Raum..." 😃

Absolut eindeutig ist auch eine GUID nicht, es ist nur relativ unwahrscheinlich, dass zwei gleiche Guids erzeugt werden.

Hinweis von gfoidl vor 12 Jahren

Vorsorglich der Hinweis: die Eindeutigkeit einer GUID in diesem Thema bitte nicht weiter diskutieren.