badwords check in datenbank

  • hi,
    ich brauche vorschläge wie ich folgendes am besten realisieren könnte:

    hab eine SQL-Datenbank mit personendaten. jetzt soll auf jeden datensatz eine plausibilitätskontrolle ausgeführt werden. zu überprüfen sind 2 millionen datensätze mit je 4-5 feldern.

    dazu habe ich config-files mit einigen regex wie z.b. alle strings die 3 gleiche buchstaben hintereinander haben, oder namen mit zahlen und sonderzeichen usw.. dazu noch eine badwords-datei wo regex drinnen stehn wie

    Code
    fut[ ]
    nigger
    schei(\u00DF|ss)
    sage *ich
    s[ao]g i
    ich *nicht
    geht *euch
    frag *doch



    jetzt will ich diese pattern auf die datensätze in der datenbank anwenden. dazu hab ich 3 lösungsansätze die alle ihre schwächen haben:

    1. überprüfung auf jedes datensatzes in meinem programm. jeden datensatz einzeln laden. in meinem programm dann alle pattern anwenden und das ergebnis zurückschreiben.
    nachteil: mit sicherheit extrem langsam, da jeder datensatz (oder wenn ich sie in blöcken lade alle 100 Datensätze) eine eigene transaction benötigen.
    vorteil: keine externen datenfiles nötig zum zwischenspeichern

    2. ein batchupdate auf alle datensätze. hierzu könnte ich alle regex in ein einziges update-statement packen. die where-clausel würde dann die regex übernehmen.
    nachteil: wahrscheinlich auch extrem langsam aufgrund der sehr komplexen where klausel. datenbank über den gesamten zeitraum ausgelastet und quasi nicht benutzbar durch eventuelle locks die blockieren.
    vorteil: rellativ einfach zu implementieren, das aufrufende programm muss nicht einmal zwingend über den ganzen zeitraum mitlaufen. nicht fehleranfällig.

    3. export der daten in ein datenfile, z.b. ein csv. das überprüfen übernimmt dann ein eigenes script, dass das csv ausliest und ergebnisse in ein weiteres file liest.
    nachteil: fehleranfällig durch externe datenfiles. arbeitsspeicher auf der maschine die das script ausführt wird ziemlich ausgelastet sein, da ziemlich viele datensätze im speicher gehalten werden müssen. läuft asyncron mit der datenbank, d.h. es können wärend der überprüfung änderungen an den datensätzen passieren -> das dürfte aber das kleinste problem sein.
    vorteil: entlastung der datenbank. für das zurückspielen der ergebnisse können die PKs verwendet werden was auch ziemlich performant sein dürfte.
    ich schätze diese variante ist die schnellste wenn auch fehleranfälligste


    was meint ihr?

    "Unkenntnis blendet und lässt uns in die Irre gehn.
    Oh, ihr elenden Sterblichen, öffnet die Augen!"

    L. Da-Vinci

  • ich kenn die Hintergruende nicht, aber ein batchupdate stell ich mir jetzt gar nicht so problemtatisch langsam vor. Vor allem in Vergleich mit der ersten Alternative. Ich nehme an das die Kontrolle nur einmal durchgeführt werden muss, bzw innerhalb grösserer Intervalle (>1Tag)? Weil ansonsten wird es wohl mehr Sinn machen, beim insert/update der einzelnen datensaetze die Ueberpruefung zu machen,

    Was ist das denn fuer ein RDBMS? PostgreSQL kann z.b. regular expressions direkt in der where Klausel auflösen. Da kannst du alles in ein normales (nicht-ganz-)SQL statement packen und fertig.

  • hi, ja danke für die hilfe. ich verwende postgres. ich hab noch ein paar tests gemacht. wenn ich mir aus den ganzen badwords eine einzige regex zusammenschustere, dann braucht die wirklich rellativ wenig zeit. nur ein paar minuten :) hätte ich mir wirklich nicht gedacht.

    ja das mit der überprüfung direkt bei den inserts/updates hab ich mir auch überlegt. das problem ist aber hier, dass diese in möglichst kurzer zeit passieren müssen, da hab ich nicht viel spielraum für zusätzliche überprüfungen..

    also werd ichs mit batchupdates versuchen :thumb: da wir aber grad beim thema sind, vlt könnt ihr mir bei einer regex helfen. was rellativ einfach scheint und auch hier so steht, scheint nicht ganz zu funktionieren:

    gib mir alle datensätze in denen kein buchstabe oder keine zahl steht:

    select * from mytable where field ~* '[^a-z|^0-9]'
    bzw.
    select * from mytable where field ~* '[^\w]'

    allerdings spuckt er mir hier beinahe alle datensätze aus. ich würd mal sagen, die regex drückt viel mehr die bedingung:
    alle datensätze bei denen mindestens ein zeichen kein buchstabe und keine zahl ist aus.

    mit der bedingung "von anfang bis ende nur andere zeichen als buchstaben und zahlen" funktioniert es, aber die abfrage dauert dafür sehr lange:
    select * from mytable where field ~* '^[^a-z|^0-9]+$'

    habt ihr vlt bessere vorschläge?

    "Unkenntnis blendet und lässt uns in die Irre gehn.
    Oh, ihr elenden Sterblichen, öffnet die Augen!"

    L. Da-Vinci

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!