Masseneinfügestrategie von c # zu SQL Server

In unserem aktuellen Projekt senden Kunden eine Sammlung komplexer / verschachtelter Nachrichten an unser System. Die Häufigkeit dieser Meldungen liegt bei ca. 1000-2000 msg / pro Sekunde.

Diese komplexen Objekte enthalten die (hinzuzufügenden) Bewegungsdaten sowie die Stammdaten (die hinzugefügt werden, wenn sie nicht gefunden werden). Anstatt die IDs der Stammdaten zu übergeben, übergibt der Kunde die Spalte "Name".

System prüft, ob zu diesen Namen Stammdaten existieren. Wenn es gefunden wird, verwendet es die IDs aus der Datenbank. Andernfalls erstellen Sie zuerst diese Stammdaten und verwenden dann diese IDs.

enn die Stammdaten-IDs aufgelöst sind, fügt das System die Transaktionsdaten in eine SQL Server-Datenbank ein (unter Verwendung der Stammdaten-IDs). Die Anzahl der Master-Entitäten pro Nachricht liegt zwischen 15 und 20.

Folgen sind einige Strategien, die wir annehmen können.

Wir können Master-IDs zuerst aus unserem C # -Code auflösen (und Stammdaten einfügen, wenn sie nicht gefunden werden) und diese IDs im C # -Cache speichern. Sobald alle IDs aufgelöst sind, können wir die Transaktionsdaten mithilfe von @ massenweise einfügeSqlBulkCopy Klasse. Wir können die Datenbank 15 Mal aufrufen, um die IDs für verschiedene Entitäten abzurufen, und dann die Datenbank noch einmal aufrufen, um die endgültigen Daten einzufügen. Wir können dieselbe Verbindung verwenden, um sie nach all dieser Verarbeitung zu schließen.

Wir können alle diese Nachrichten, die Stammdaten und Transaktionsdaten enthalten, in einem einzigen Treffer an die Datenbank senden (in Form von mehreren TVP) und dann in einer gespeicherten Prozedur zunächst die Stammdaten für die fehlenden erstellen und dann die Transaktionsdaten einfügen.

Kann jemand den besten Ansatz für diesen Anwendungsfall vorschlagen?

Aufgrund von Datenschutzproblemen kann ich die tatsächliche Objektstruktur nicht freigeben. Aber hier ist die hypothetische Objektstruktur, die unserem Geschäftsobjekt @ sehr nahe komm.

Eine solche Nachricht enthält Informationen über ein Produkt (seine Stammdaten) und seine Preisdetails (Transaktionsdaten) von verschiedenen Anbietern:

Master-Daten (die hinzugefügt werden müssen, wenn sie nicht gefunden werden)

Produktname: ABC, Produktkategorie: XYZ, Hersteller: XXX und einige andere Details (Anzahl der Eigenschaften liegt im Bereich von 15-20).

Transaktionsdaten (die immer hinzugefügt werden)

Vendor Name: A, ListPrice: XXX, Discount: XXX

Vendor Name: B, ListPrice: XXX, Discount: XXX

Vendor Name: C, ListPrice: XXX, Discount: XXX

Vendor Name: D, ListPrice: XXX, Discount: XXX

Die meisten Informationen zu den Stammdaten bleiben gleich, wenn eine Nachricht zu einem Produkt gehört (und sich weniger häufig ändert), aber die Transaktionsdaten schwanken immer. Das System prüft also, ob das Produkt 'XXX' im System vorhanden ist oder nicht. Wenn nicht, prüfen Sie, ob die mit diesem Produkt angegebene Kategorie nicht existiert. Wenn nicht, wird ein neuer Datensatz für die Kategorie und dann für das Produkt eingefügt. Dies erfolgt für Hersteller- und andere Stammdaten.

Mehrere Anbieter senden gleichzeitig Daten zu mehreren Produkten (2000-5000).

So nehmen Sie an, dass wir 1000 Lieferanten haben, jeder Verkäufer sendet Daten über 10-15 verschiedene Produkte. Nach jeweils 2-3 Sekunden sendet uns jeder Anbieter die Preisaktualisierungen dieser 10 Produkte. Möglicherweise beginnt er mit dem Senden von Daten über neue Produkte, was jedoch nicht sehr häufig sein wird.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage