Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Datenbank-Sychronisation
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 407

Themenstarter:

Datenbank-Sychronisation

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Schleifer
myCSharp.de - Member



Dabei seit:
Beiträge: 24

beantworten | zitieren | melden

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 :)
private Nachricht | Beiträge des Benutzers
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 407

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Und warum benutzt du nicht Sync Framework
private Nachricht | Beiträge des Benutzers
Florian Reischl
myCSharp.de - Experte

Avatar #avatar-2880.jpg


Dabei seit:
Beiträge: 1596
Herkunft: München

beantworten | zitieren | melden

Hallo

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

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.
Zitat
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ß.
private Nachricht | Beiträge des Benutzers
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 407

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
manfred.baur
myCSharp.de - Member



Dabei seit:
Beiträge: 24

beantworten | zitieren | melden

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..." :-)
private Nachricht | Beiträge des Benutzers
Coder007
myCSharp.de - Member



Dabei seit:
Beiträge: 1249

beantworten | zitieren | melden

Zitat von manfred.baur
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.
private Nachricht | Beiträge des Benutzers

Moderationshinweis von gfoidl (10.09.2011 - 19:45:18):

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