Autor |
Beitrag |
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mo 14.12.09 21:17
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
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Flamefire
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: 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
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 14.12.09 23:12
Martok hat folgendes geschrieben : | 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?
_________________ Na denn, dann. Bis dann, denn.
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
alzaimar
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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'.
_________________ Na denn, dann. Bis dann, denn.
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 15.12.09 00:23
@Martok: GIDF ... dev.mysql.com/doc/re.../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???
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 15.12.09 00:37
alzaimar hat folgendes geschrieben : | 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.
BenBE hat folgendes geschrieben : | 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 alzaimar für die Bestätigung.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
|