Laden...

Millionen von Datensätze von mehreren Benutzern gleichzeitig prüfen

Erstellt von Unfug vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.609 Views
U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 5 Jahren
Millionen von Datensätze von mehreren Benutzern gleichzeitig prüfen

verwendetes DatenbankHsystem: <mssql>

Hallo zusammen,

ich hänge derzeit bei einem Problem was mit konkurrierende Zugriffen zu tun hat.

Der Ablauf ist relativ einfach.

Daten werden aus einer MS SQL gelesen, diese werden geprüft und entsprechend mit einem aktualisierten Flag - geprüft - zurück in die SQL geschrieben.

Es handelt sich um Millionen von Datensätze, die manuell durch mehrere Mitarbeiter gleichzeitig geprüft werden.

Die derzeitige Vorgehensweise ist wie folgt:
Programmatisch aber auch in der UI werden die Datensätze in Gruppen aufgeteilt (1-1000). Jede Gruppe besitzt demnach tausende Datensätze.
Die Mitarbeiter untereinander sprechen sich ab, wer welche Gruppe nimmt und bearbeitet jene.
Hierfür werden bewusst programmatisch diese Gruppen erstellt und in einen Cache gespeichert.

Das ist alles sehr unschön, sowohl programmatisch als auch in der UI, als auch im Ablauf. Ohne Absprache geht hier nichts.
Ich suche nach einer eleganten Lösung ohne diese Gruppen.
Wichtig ist vielleicht noch zu sagen, dass die Reihenfolge der Datensätze idealerweise beibehalten wird. Also Random Pick aus der Datenbank ist nicht möglich. Auch werden aktuell die tausende Datensätze auf einer Seite angezeigt, da das Prüfung teilweise nur ein paar Sekunden pro Datensatz benötigt.

Mir fällt derzeit nichts schlaueres ein. Euch?

Danke

T
2.219 Beiträge seit 2008
vor 5 Jahren

Wie sollen wir dir hier helfen?
Ohne konkrete Informationen, wie die Daten gruppiert sind, oder wie diese den bearbeitet werden, kann dir keiner eine sinnvolle Lösung anbieten.

Was wird an den Daten eigentlich verarbeitet?
Das Mitarbeiter manuell einige Mio. Datensätze überhaupt händisch anfassen müssen, klingt schon nach einem falschen Ansatz.
Gerade solche Datenmengen sprechen schon für Automatisierung.
Oder gibt es hier spezielle Gründe, dass jeder Eintrag manuell bearbeitet werden muss?
Hier fehlen also auch die Hitnergrundinformaionen, weshalb dies so gelöst wurde.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.807 Beiträge seit 2008
vor 5 Jahren

Das Mitarbeiter manuell einige Mio. Datensätze überhaupt händisch anfassen müssen, klingt schon nach einem falschen Ansatz.

Zuerst meinst Du, dass Dir konkrete Informationen fehlen, und dann sagst Du pauschal, dass das der falsche Ansatz ist.
Du kennst doch gar nicht den Kontext, um dies beurteilen zu können... 🤔

Natürlich gibt es auch heute noch Anforderungen, dass Millionen von Datensätzen manuell geprüft werden müssen.
_Tatsächlich _braucht man für gewisse Dinge einfach immer noch Menschen. 👍

Vermutlich kam die Firma von Unfug durchaus schon auf die Idee, das Ganze zu automatisieren.
Aber offensichtlich ist der Bedarf da, dass dafür mehrere Menschen tatsächlich einen Job haben. ⚠

Unfug, bei so einem Fall würde ich mit einem wirklichen Anforderungsprofil beginnen: macht der derzeitige Prozess so wirklich sinn, geht es nicht effizienter für diese Mitarbeiter - oder haben sie sich einfach an das bisherige so gewöhnt?
Das gäbe zumindest die Möglichkeit den Prozess durchaus auch technisch effizienter zu gestalten.
Im Prinzip würde das in Richtung Domain-Driven Design gehen, um die technische Anforderung dem Kontext gerecht zu werden.

Ansonsten muss ich aber T-Virus Recht geben, dass die Menge an Informationen kaum für eine Lösungsfindung ausreichen.

U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 5 Jahren

Hallo,

erstmal Dank.

Zur Automatisierung:
Es handelt sich in der Tat um einen bewussten manuellen Prozess. Die Daten benötigen teilweise menschliche Interpretationen, da einige Informationen unvollständig/fehlerhaft sind. Die Mitarbeiter haben aber die Möglichkeit in anderen (nicht IT zugreifbare) Quellen nachzuschauen.
Auch kann es sein, dass einige Daten fehlerhaft bleiben und trotzdem als geprüft/gültig angesehen werden.

Als ITler wünscht man sich natürlich mehr Automatisierung. Allerdings ist es schwer einen existierenden Prozess an denen 20 Mitarbeiter arbeiten derart zu ändern.

Zu den Daten:
Es handelt sich um eine sehr flache einfache Struktur.


|ID|Wert1|Wert2|Wert3|Wert4

Die Gruppierung ist eine rein programmatische Sache.
Nehme ID 0 bis 1000 => Gruppe 1
Nheme ID 1001 bis 2000 => Gruppe 2
Die Gruppen kommen dann in einen Cache und können so jedem Mitarbeiter zugeordnet werden. Nach Abschluß passiert dann einfach

foreach(datensatz in Gruppe)
{
Update in MSSQL(datensatz)
}

Leider kann ich nicht mit konkreten Datensätzen kommen. Ich hoffe es ist etwas klarer geworden.

Danke

C
2.121 Beiträge seit 2010
vor 5 Jahren

Gib den Daten ein Sperrflag. Der nächste Mitarbeiter der Daten überprüfen will bekommt dann nur die nächsten 100 anstehenden Datensätze. (oder beliebige Zahl) Diese werden gesperrt damit sie kein anderer auch noch zugeteilt bekommt.
Die Änderungen die er macht werden dann wieder gespeichert und das Sperrflag entfernt, dafür müssen die Datensätze als bearbeitet gekennzeichnet werden.

Damit muss man nichts mehr im Voraus aufteilen und noch viel wichtiger, die Mitarbeiter brauchen sich nicht mehr absprechen.

Wenn die Daten nach einer bestimmten Zeit automatisch wieder entsperrt werden sofern das Programm des Mitarbeiters die Sperre nicht neu setzt, werden die Daten wieder freigegeben und ein anderer kann sie bearbeiten. Damit kann jemand sein Programm beenden und die ihm zugeteilten Datensätze bleiben nicht auf ewig gesperrt.

Muss man sicher noch ein bisschen ausarbeiten, aber die starre Einteilung die bisher stattfindet lässt sich bestimmt auch in deinem Fall umgehen.

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

hab bei uns etwas ähnliches machen müssen - allerdings in kleinerem Maßstab, da ein Teil der Daten vollautomatisch aufbereitet werden konnte.

Die Reihenfolge
Um ehrlich zu sein weiß ich nicht, wie die Aufbereitung der Daten die Reihenfolge ändern sollte - kann ich somit nichts zu sagen.

Ich für meinen Teil habe unaufbereitete Daten in einer anderen Tabelle wie aufbereitete Daten gesammelt - aber einen Unterschied macht das praktisch nicht. Die Datensätze brauchen jedenfalls:

  1. Ein Feld, in dem der Mitarbeiter, der diese aufbereiten soll bzw. seine ID eingetragen wird
  2. Ein Feld, wann der Mitarbeiter sich den Datensatz "geschnappt" / "gesperrt" hat
  3. Bei dir dann noch ein Feld in dem steht ob die Daten schon aufbereitet wurden

Im Programm würde ich eine Wizard-ähnliche Struktur vorhalten, die dem User schön sauber je einen Datensatz präsentiert. Bei mir ist es so gemacht, dass sich das Programm bei jedem Click auf "Weiter" einen neuen Datensatz und RestCounter (Motivation^^) holt und den Datensatz in der DB jeweils mit User + Zeitstempel sperrt. Vom SQL-Zugriff entfernt man dann erst alle abgelaufenen Logs - und holt sich dann den ersten Datensatz ohne Sperrung. (Die Sperrung sollte auch eine überzogene Mittagspause aushalten)

LG

16.807 Beiträge seit 2008
vor 5 Jahren

Reihenfolgen von Einträgen in Datenbanken sind ausschließlich durch die Sortierung garantiert.

U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 5 Jahren

Hallo,

Danke. Also im Prinzip wirklich die Datenstruktur erweitern um Felder, die dann dazu genutzt werden die Gruppen zu managen. Also das was aktuell noch im Vorfeld passiert entsprechend direkt auf Datenstruktur Ebene

ID|Wert1|Wert2|Mitarbeiter ID|ZugeteiltAm|AbgeschlossenAm|InArbeit(true/false)|StatusGeprüft|

Programmatisch müsste ich dann noch sicherstelen, dass die Abrufe nicht gleichzeitig stattfinden, sondern sequentiell, da ich ja erst ein SELECT WHERE InARbeit=false ist, dann ein UPDATE SET InArbeit=true mache.

Soweit korrekt?
Klingt eigentlich plausibel und einfacher als gedacht.

C
2.121 Beiträge seit 2010
vor 5 Jahren

Für das sequentielle gibt es Transaktionen. Die sollten immer genutzt werden wenn solche Datenänderungen passieren.
Das InArbeit könnte aus anderen Feldern geschlossen werden. Zum Beispiel zugeteilt aber noch nicht abgeschlossen bedeutet: ist in Arbeit.