Bilderverwaltung - Verschiedenes

Astrodan

Gamma Cephei
ID: 119839
L
10 Dezember 2006
1.113
209
Servus!

Die Überschrift ist jetzt leider recht nichtssagend.. mir fiel nichts besseres ein. Kurz: es geht a) um ein Verfahren, wie man in der Datenbank Ordnung bewahrt und b) um Trigger

Kurze Beschreibung:
Ich habe eine Tabelle pictures, eine pictureusers und einige Gallery-Tabellen.
Die erste Tabelle dient dazu, Daten über hochgelandene Bilder zu speichern (Pfad, Größe, Datum, Titel, ..). Dies wird alles von einer Klasse (PictureUpload) übernommen.
Die Tabelle pictureusers enthält Informationen, wo die gespeicherten Bilder alle verwendet werden.
In den Gallery-Tabellen weiterhin stehen Informationen über die existente Galerien sowie die zugehörigkeiten der Bild-IDs zu den Galerien. Dies wird von einer Klasse GalleryUpload (extends PictureUpload) übernommen.

Die Fragen wären jetzt:
a) Wenn ich einer Galerie ein Bild zuweise, wird in die Tabelle pictureusers Information eingefügt, um beim Löschen des Bildes dieses auch aus der Galerie zu löschen. Aktuell funktioniert das über das Speichern eines MySQL-Queries, welcher dann ausgeführt wird.
Ist das so sinnvoll, oder gibt es da intelligentere Alternativen?

b) Ich hab heute zum ersten Mal Trigger gesehen. Jetzt habe ich überlegt, dass es eigentlich sinnvoll wäre obigen Eintrag in der Tabelle pictureusers per Trigegr zu erledigen, so dass die Datenbank die Hauptarbeit übernimmt. Ist sowas sinnvoll, oder sollte man doch lieber auf PHP zurückgreifen?
 
Ist das so sinnvoll, oder gibt es da intelligentere Alternativen?
Versteh ich richtig: Du speicherst ne SQL-Befehlszeile? Das is sicherlich niemals sinnvoll.

Wenn du ein Bild löscht, dann lösche es auch aus der Galerie. Das geht einfach mit seinem Primärschlüssel den jedes Bild hat und ja als Fremdschlüssel in deiner Galerie-Tabelle drin is. Einfaches DELETE tut das - kein großes Geheimnis.

@Trigger:
Mit Triggern müsstest du dieses DELETE-Statement für die Galerie automatisch machen lassen können, wenn du das Bild löscht.

Ich hab allerdings noch nie Trigger benutzt, da musst du auf die nächsten Posts warten oder eben solang im Manual lesen, wies geht ;)
 
Also Trigger habe ich auch noch nicht benutzt. Viuelleicht wäre es auch sinnvoll hierbei eine Db zu nutzen, die PK,FK und halt auch on delete, on update etc. kennt.
 
Versteh ich richtig: Du speicherst ne SQL-Befehlszeile? Das is sicherlich niemals sinnvoll.
Dachte ich auch, aber..

Wenn du ein Bild löscht, dann lösche es auch aus der Galerie. Das geht einfach mit seinem Primärschlüssel den jedes Bild hat und ja als Fremdschlüssel in deiner Galerie-Tabelle drin is. Einfaches DELETE tut das - kein großes Geheimnis.
Ja, soweit ganz einfach gedacht. Das Problem ist ja nur, dass das löschen sinnvollerweise über eine Klasse geht, die die Bilder verwaltet. Die weiß aber nichts von der Existenz einer Galerie, oder auch eines Newseintrages (wo das Bild genauso drin sein kann). Die Klasse muss aber dennoch die Bilder aus der Galerie löschen, oder das Bild zum Newseintrag bspw. ersetzen.
Deswegen speichern die Klassen der Galerie / der News einen Query, denn den kann die Picture-Klasse einfach ausführen.

Alternativ denke ich über callback-functions nach (heißen die so), die das übernehmen. Aber das halte ich für recht kompliziert

Edit:

@Bububoomt: PK / FK? Sry, bin nicht so ganz drinne in dem Kram, mach das nur als Hobby...
 
Das Problem ist ja nur, dass das löschen sinnvollerweise über eine Klasse geht, die die Bilder verwaltet. Die weiß aber nichts von der Existenz einer Galerie, oder auch eines Newseintrages (wo das Bild genauso drin sein kann).
Dann is dein Klassen-Entwurf bescheiden :p

Ich weiß ja ned, wies genau bei dir aussieht, aber ich versteh das so, dass dir ne Art Galerie-Bilder-Verwalter fehlt. Ne Klasse, die alle Bilder und alle Galerien kennt/abrufen kann und sich ums Löschen kümmern kann.

Oder: Geschicktes Ableiten Bild -> GalerieBild, was zusätzlich deine benötige Funktion implementieren kann.
@Bububoomt: PK / FK? Sry, bin nicht so ganz drinne in dem Kram, mach das nur als Hobby...
PK = Primary Key = Primärschlüssel
FK = Foreign Key = Fremdschlüssel
 
Ich weiß ja ned, wies genau bei dir aussieht, aber ich versteh das so, dass dir ne Art Galerie-Bilder-Verwalter fehlt. Ne Klasse, die alle Bilder und alle Galerien kennt/abrufen kann und sich ums Löschen kümmern kann.

Okay, mal kurz Bildlich sieht mein Klassenentwurf vor, dass ich eine Bild Klasse habe, von der leite ich die Galerie ab (d.h. Vererbung). Somit könnte ich genauso die Galerie zum löschen nutzen.

Dann wäre da das Newssystem. Dieses von der Bilder-Klasse abzuleiten wäre nicht sonderlich logisch, aber es kann sie sehr gerne benutzen. Damit hat es ebenfalls Zugriff auf die Löschen Funktion, allerdings die von der Klasse Bild.

Sinnvollerweise greifen jetzt sowohl die Galerie, als auch das Newssystem auf den gleichen Bilder-Pool zu, d.h. beide können das gleich Bild nutzen, ohne dass es doppelt in der DB auftaucht.

Wenn ich das Bild jetzt löschen möchte, dann kann ich den Aufruf über die Klasse Bild machen - die würde Relikte in der News-Tabelle und der Galerie-Tabelle hinterlassen. Alternativ über die Galerie - die würde Relikte im news-System hinterlassen. usw. usf... - und es ist ja durch die wiederverwendbarkeit nicht auszuschließen, dass nicht noch mehr Systeme hinzukommen, die auf die Bilder-DB zugreifen.

Deswegen hielt ich es für sinnvoll der Klasse Bilder die Möglichkeit zu geben, ohne weitere Infos die Sachen zu löschen, und effektiv fielen mir da nur die gespeicherten Queries ein...
 
Ich denke auch das eine weitere Klasse die über alle Bilder bescheid weis am sinnvolsten ist. Diese Manager Klasse löscht dann das Bild in der Gallerie und News.

Eine weitere Alternative die mir gerade eingefallen ist, ist die Verwendung des Composite Patterns. Könnte aber auch overkill sein. :D
Mit dem Composite Pattern lassen sich n - Objekte zusammenfügen und Methoden dieser ausführen als wären sie ein Objekt. Vorrausetztung ist hier das die Methoden per Interface implemetiert sind. (Den gleichen Namen haben.)
PHP:
$composite = new Composite();
$composite->add($news);
$composite->add($gallerie);
$composite->remove($pic);