Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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?

_________________
Na denn, dann. Bis dann, denn.
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 15.12.09 00:17 
Oje und ich dachte MySQL hat was... Na ja.

Ab und an ein
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"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."