2016-09-14 4 views
0

Wir haben eine interne Software, die auf einer SQL-Server DB mit einer Master-Tabelle und mehreren verbundenen Tabellen basiert. Die Art der Daten, die wir speichern, ist ziemlich schwer zu beschreiben, aber wir haben eine Kundentabelle mit einigen verknüpften Tabellen: Bestellungen, Sendungen, Telefonprotokolle, Reklamationen usw.SQL-Master-Detail-Tabellen - besser UPDATE oder DELETE + INSERT?

Wir müssen diese Software mit einer externen synchronisieren Diese hat eine eigene DB (mit der gleichen Struktur) und erzeugt eine XML-Datei mit aktualisierten Informationen über unsere "Kunden" (eine Datei pro Kunde). Updates können sich in der Master-Tabelle und/oder in 0 bis n verbundenen Tabellen befinden.

Um diese Dateien zu importieren, besteht eine Möglichkeit darin, alle beteiligten Tabellen abzufragen und sie mit der XML-Datei zu vergleichen, wobei möglicherweise Zeilen hinzugefügt, aktualisiert und gelöscht werden.

Dies würde eine Menge Codierung erfordern.

Eine weitere Möglichkeit besteht darin, alle Daten für den gegebenen Kunden (zumindest aus den verbundenen Tabellen) komplett zu löschen und neu einzufügen.

Dies wäre nicht so effizient.

Bitte beachten Sie, dass die Master-Tabelle 13 Felder und es gibt etwa 6 Tabellen mit 3 bis 15 Felder.

In dieser App verwenden wir hauptsächlich LINQ.

Wie würden Sie fortfahren?

PS: Ich habe ein paar Antworten zu diesem Thema hier auf StackOverflow bemerkt, aber fast alle betreffen (einzelne Zeilen in) einzelne Tabellen.

Antwort

0

Für ein Szenario, wo ich viele Join und viele Zeilen habe, ich lieber zu aktualisieren und logische Löschungen vornehmen. Beispiel Ich habe Millionen von Kunden und passiert, dass ich Dutzende Tabellen mit Millionen Zeilen habe, wobei FK auf Kundennummer verweist. Der Versuch, einen Kunden zu löschen, kann einige Minuten dauern.

Für Ihr spezielles Szenario kann ich ein Flag in jeder relevanten Tabelle verwenden, um mir zu sagen: Diese Zeilen wurde bereits synchronisiert, die Zeile wurde eingefügt, wie ausstehende Export, die Zeilen ausstehende Löschung oder die Zeilen wurde in XML exportiert die Vergangenheit wurde aber aktualisiert.

Für Exporte:

Es einfach machen kann nur die Zeilen abfragen ausstehenden Zeilen auf dem neuesten Stand sind zu iserted, aktualisiert oder gelöscht und ignoriert.

Für Importe:

Wenn das andere System nicht diese Möglichkeit haben, es gibt einen kleinen Trick Sie tun können. Fügen Sie eine "externe ID" -Spalte hinzu, um Ihre Datenbank schnell zu durchsuchen und die Zeilen zu identifizieren, die von dieser externen Quelle stammen. Auch wenn Sie diesen Trick anwenden, kann es ein Problem sein, zu finden, ob nur diese Telefonnummer in dieser großen Tabelle aktualisiert wurde. Für diese extremen Fälle können Sie eine mit einem Hash berechnete Spalte verwenden, um schnell festzustellen, ob die beiden Zeilen unterschiedlich sind, und die gesamte Zeile (mindestens die gemeinsame Spalte) zu aktualisieren.

+0

Vielen Dank Jean für Ihre Antwort. Daten werden niemals aus unserer Anwendung exportiert. Unsere App ist hauptsächlich schreibgeschützt und die Daten werden regelmäßig von der Drittanbieter-App aktualisiert (über xml). Und natürlich enthält jede XML-Datei alle Daten über einen einzelnen Kunden (sowohl Daten, die ich bereits in meiner Datenbank habe und Daten, die ich hinzufügen/bearbeiten/löschen muss). Also jedes Mal, wenn eine Datei kommt, kann ich nicht sagen, was ich aktualisieren sollte, es sei denn, ich vergleiche jede Zeile. Es ist mir nicht klar, wie kann ich das mit Flaggen umgehen? – Disti

+0

Flags sind nur nützlich für Exporte (eine Schande, dass das andere System Ihnen nicht sagen kann, was aktualisiert, eingefügt, gelöscht wird) und für das logische Löschen. Nur für Importe können Sie die "externe ID" erstellen und wenn die Tabelle groß ist, verwenden Sie auch eine Hash-Spalte, um herauszufinden, ob es überhaupt ein Update gibt. Sie können die XML-Datei sogar mit einem Hash-Code versehen, um zu prüfen, ob sich die Datei im Vergleich zur vorherigen Version geändert hat – jean

0

Eine Idee (unter Berücksichtigung Sie tun dies, Server-Seite auf Datenbank):

  • Tabellen Erstellen Sie den Kunden xml aus. Dies kann eine temporäre Tabelle oder eine In-Memory-Tabelle sein.
  • Erstellen Sie SELECT-Abfragen, um neue, aktualisierte, gelöschte Daten zu finden.Diese Select-Abfragen würden die Tabellen in Ihrer Datenbank und die aus dem Kunden-XML erstellte Tabelle verbinden. Die Ausgabe des Joins würde anzeigen, ob Sie neue Datensätze, aktualisierte Datensätze, gelöschte Datensätze oder eine Mischung daraus haben.
  • Einfügung ausführen, aktualisieren, entsprechend löschen.
Verwandte Themen