Kundendatensätze

port29

deus.Server
Hallo Leute,

ich arbeite gerade an einer Ticket-Software, die natürlich auch an Warenwirtschaft angebunden sein muss. Nur mein Problem ist jetzt, dass ich bei der Warenwirtschaft nur anhand der Kundennummer mir die Daten aufrufen lassen kann. Das Ticketsystem soll aber auch nach der E-Mail Adresse und der Telefonnummer suchen können.

Und genau an dieser Stelle befindet sich auch mein Problem. Ich weiß, dass die Software die Kundendatensätze jede Nacht in eine CSV Datei exportiert, die ich einlesen kann. So bekomme ich alle neuen Kunden und auch alle Änderungen der bestehenden Kundensätze mit. Doch wie gehe ich mit dieser Datei am besten um? Ich sehe da so direkt eigentlich zwei Möglichkeiten:

1) Pro Datensatz lege ich mir ein neues Kundenobjekt an und packe das in zwei Dictionarys. Eins davon mit der E-Mail Adresse als Schlüssel und eins mit der Telefonnummer.

2) Nach dem Einlesen der Daten leere ich eine MySQL Tabelle und packe die Datensätze in die Tabelle rein. Bei jeder Suche führe ich dann ein Select Query aus.

Damit wir hier wissen, um welche Daten es genau geht. Es sind ca. 350.000 Kundensätze bestehend aus Kundennummer, E-Mail, Telefon, Name, Vorname -> Alles Strings
 
Ich verstehe den Sinn der beiden dictionarys nicht.

Ich würde mir eine Kunden Klasse erstellen die alle relevanten Daten eines Kunden aus der csv hält.
Dies als Liste dann merken und über Transaction die Werte in die DB schreiben.

Zuerst per UPDATE prüfen ob ein entsprechender Datensatz schon existiert und den anpassen, falls nicht per INSERT einfügen.

Zum Schluss über DELETE und einer passenden WHERE Klausel die Datensätze entfernen die nicht in der csv auftauchten.

Prüfung könntest du ja alles (UPDATE und DELETE) über die Kundennummer.

Falls nun beim schreiben in die DB etwas schief geht hättest du dank Transaction noch den alten Stand.

P.S.: Aber irgendwie hab ich das Gefühl das ich dich nicht ganz verstanden hab.

Edit:
Ja jetzt hab ichs glaube kapiert.

Wenn du die Daten nur in Dateiform vorliegen hast ist es glaube besser die einmal einzulesen.
Wie oben schon gesagt entsprechende Klasse erstellen und in einer List<T> halten.

Diese generische Liste hat ein paar Prima Funktionen zum suchen und liefern von Datensätzen (Exists, Find, FindAll, ..).
Du musst nur eine Methode laut dem delegate Predicate<T> erstellen und an die List Methoden übergeben (jeweils eine eigene Methode für das wonach du suchst).
(msdn kanns dir ev. besser erklären)
 
Zuletzt bearbeitet:
Ich verstehe den Sinn der beiden dictionarys nicht.

Edit:
Ja jetzt hab ichs glaube kapiert.

Wenn du die Daten nur in Dateiform vorliegen hast ist es glaube besser die einmal einzulesen.
Wie oben schon gesagt entsprechende Klasse erstellen und in einer List<T> halten.

Diese generische Liste hat ein paar Prima Funktionen zum suchen und liefern von Datensätzen (Exists, Find, FindAll, ..).
Du musst nur eine Methode laut dem delegate Predicate<T> erstellen und an die List Methoden übergeben (jeweils eine eigene Methode für das wonach du suchst).
(msdn kanns dir ev. besser erklären)

Der Sinn einer Dictionary ist der Zugriff auf die Datensätze in einer Laufzeit von O(1), Find bzw. Exists läuft in O(n). Und bei 350.000 Datensätzen ist O(n) schon etwas hart. Genau das gleiche problem habe ich auch bei den Updates, wenn ich die Aktionen gegen eine Datenbank ausführe.

Deshalb dachte ich eben an zwei Dictionarys (und keine Listen!)
 
Sorry dictionary verstand ich nicht als ich noch dein Problem falsch gedeutet hatte ;)

Und bei dictionarys hätte ich mehr das Problem das die Suche zu starr wäre.

Ich hab gerade gegoogelt und nixs brauchbares über Geschwindigkeitsaussagen gefunden.
Aber ev. hilt ja ne Liste in Verbindung mit LINQ.
 
Zurück