Entwickler-Ecke

Programmiersprachen (Server) - "Garbage Collector" für DB realisieren?


Martok - Mo 14.12.09 21:17
Titel: "Garbage Collector" für DB realisieren?
Hi!

Ich hätte da mal wieder ein Problemchen.

Ich habe einen Ordner voll Dateien, welche gewissermaßen als aus der Datenbank ausgelagerte BLOBs zu verstehen sind. Jede Datei wird von M (M>0) Datensätzen in einer Tabelle referenziert.

Wenn nun eine solche Referenz gelöscht wird, soll, falls das die letzte war, auch die Datei aufgeräumt werden.

Mein Lieblingsansatz wäre eine Art Garbage Collector, der in Abständend alle Dateien löscht, die von nirgendwo mehr referenziert werden. Dann könnte man das nämlich machen, wenn der Server sich eh langweilt.
Dazu müsste ich ja aber das Verzeichnis iterieren, was ich eigentlich gern vermeiden würde, eben weil das aufwändig ist.

Hat wer noch andere schöne Ideen, oder sollte man doch einfach bei jedem DB-Eintrag löschen die Datei beräumen sofern das notwendig ist?
Ist das überhaupt ein Problem oder mache ich mir da grad nur selber das Leben schwer?

Danke schonmal,
Martok


BenBE - Mo 14.12.09 21:32

Mach dir nen Trigger auf's Delete und inserte ne Referenz auf das zu löschende BLOB in ner zusätzlichen Tabelle ...

Im Idle dann einfach nen SELECT auf die Table und alle Einträge daraus killen ...


Flamefire - Mo 14.12.09 22:57

Oder du baust dir gleich eine neue Tabelle mit den Dateien. Sowas wie (ID, RefCount, FileName)
Dann kannst du beim Eintragen immer den Refcount erhöhen und beim Austragen veringern.
Dann ein Select und du hast alle zu löschenden.

Alternativ kannst du den RefCount auch weglassen, und über ein Select gehen (Nach der art, suche alle Datensätze aus Filetabelle, die von keinem Eintrag in der Haupttabelle referenziert sind. Geht mit einem simplen Join)


alzaimar - Mo 14.12.09 23:12

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe einen Ordner voll Dateien, welche gewissermaßen als aus der Datenbank ausgelagerte BLOBs zu verstehen sind. Jede Datei wird von M (M>0) Datensätzen in einer Tabelle referenziert.
Kannst du die BLOBs nicht einfach in der DB lassen?


Martok - Di 15.12.09 00:09

Ich sollte erwähnen (auch wenn das eigentlich naheliegend ist, wo das doch PHP ist), dass es sich um einen MySQL handelt.
Da fallen so nette Sachen wie Trigger und Daten in der DB halten schon aus Performancegründen flach.
Mal davon ab, dass ich die Daten da so viel besser raus- und in den Apachen rein kriege.

Werde wohl doch einfach nach dem DELETE direkt zum Handfeger greifen.


alzaimar - Di 15.12.09 00:17

Oje und ich dachte MySQL hat was... Na ja.

Ab und an ein

SQL-Anweisung
1:
2:
3:
4:
  select ExternalBlobIdentifier 
    from BlobReferenceTable 
group by ExternalBlobIdentifier 
  having count(*)>0

Und lösch alle 'ExternalBlobIdentifier'.


BenBE - Di 15.12.09 00:23

@Martok: GIDF ... http://dev.mysql.com/doc/refman/5.1/de/create-trigger.html
Im Zweifelsfalle brauchst du dafür zwar ne InnoDB; aber das sollte ja nun nicht das Problem sein. Ggf. über ne SP klären ;-)

Und was machst du so Performancehungriges???


Martok - Di 15.12.09 00:37

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Oje und ich dachte MySQL hat was... Na ja.

Hat schon, aber ich kenne genug fette MySQL-Projekte um zu wissen dass die Einrichtung so dass das einigermaßen performt überproportional viel Aufwand ist.

@BenBE: Bevor man Leute auf Google verweist, sollte man kurz über das zuvor gelesene nachdenken. Oder gar nichts schreiben.

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Und was machst du so Performancehungriges???

(Sehr (extrem)) Vereinfacht: Dateianhänge verwalten.
Mag zwar nicht das leistungsintensivste sein, aber es soll auch einigermaßen skalieren.

Ohne mehrfache Datenhaltung also kein Automatismus möglich. Dachte ich mir, danke user profile iconalzaimar für die Bestätigung.