User since
2003-08-15
2653
Artikel
BenutzerIn
Was meint ihr, wie z.B. Flickr die Bilder speichert?
Werden die in einer Datenbank gespeichert?
Oder wird in der Datenbank nur der Dateiname gespeichert und der Rest in Verzeichnissen?
Das Datenbankthema ist ja noch sehr umstritten.
Ich habe mittlerweile auch einige GB in einer mySQL-Datenbank gespeichert, was sogar recht gut funktioniert. Aber man hat irgendwie immer ein komisches Gefühl dabei. Irgendwann, so ab 1 GB (BLOB's), dauert dann ein OPTIMIZE TABLE auch schonmal etwas länger, ganz zu schweigen von den mysqldump's.
Jetzt bin ich echt am überlegen, ob ich in der Datenbank nur noch
Dateiname, höhe, breite, alternativtext speichere.
Aber was mich immer stört sind diese synchronisierungs-vorgänge die man machen muss, um zu prüfen, ob z.b. im dateisystem genauso viele dateien vorhanden sind wie datensätze. Es genügt ja schon, wenn das Script zwischen dem Schreiben auf die Festplatte und dem SQL-Insert abgebrochen wurde.
User since
2003-08-04
14371
Artikel
ModeratorIn
Das prüfen solltest Du schon direkt nach dem Eintrag/Speichern machen und nicht in einem extra Lauf...
*Wie* Flickr das macht kann ich nicht beantworten.
User since
2003-08-15
2653
Artikel
BenutzerIn
ja das will ich natürlich sowieso machen. Aber es kann ja sein, dass das Script urplötzlich abgebrochen wird und zwar zwischen Speichern in Verzeichnis und SQL-Insert. Ich müsste dann alle paar Stunden einen Vergleich zwischen Verzeichnis und Datenbank machen.
Ich habe allerdings gerade einen Test gemacht und schon kleine Geschwindigkeitsvorteile beim Verzeichnis-Prinzip feststellen können. Ist doch ein kleines bisschen schneller.
Mein Beispiel mit Flickr bezog sich eigentlich eher darauf, wie ihr mit großen Datenmengen umgehen würdet die so im Bereich von 30 Gigabyte liegen.
User since
2003-08-15
2653
Artikel
BenutzerIn
danke für den Link. Leider finde ich kaum deutsche Suchergebnisse dazu. Ich sehe mich da leider auf einsamem Posten, sollte ich mal Hilfe in Sachen mogilefs benötigen.
So wie ich das mittlerweile sehe, bin ich mit der Datenbank,-Verzeichnis-Lösung erstmal gut beraten.
Aber mal ein kleines Beispiel das zeigt, was blöd daran ist:
Angenommen, ich will alle Bilder eines Users löschen. Dann muss ich erstmal mit SELECT die Dateinamen ermitteln und in einer Liste an unlink() übergeben. Dann muss ich checken ob unlink erfolgreich war und dann die Datensätze löschen (DELETE).
Chaotisch wirds, wenn zwischen diesen beiden Vorgängen der Prozess abgebrochen wird.
User since
2003-11-28
3645
Artikel
ModeratorIn
Mach's doch so: erstmal in der DB nur markieren, dass der Datensatz gelöscht werden soll. Dann machst du die unlinks und zum Schluss das DELETE. Falls der Prozess zwischen unlink und DELETE unterbrochen wird, hast du ja noch immer die Liste der zu löschenden Datensätze und kannst diese nochmal bearbeiten.
User since
2006-07-10
2611
Artikel
BenutzerIn
Oder falls es sich um eine Postgresql ( >= 8.0)handelt kannst du auch gut PL/Perl nutzen um in der DB selber Funktionen zu schreiben und damit die Dateiaktionen machen. Dank Trigger klappt dann auch das Löschen der Dateien automatisch, wenn der Datensatz gelöscht wird.
Das Script macht dann nur noch reine Datenbankaktionen.
User since
2003-08-15
2653
Artikel
BenutzerIn
ich nutze mySQL.
Da gibt es auch Trigger.
Aber soweit ich weiss kann man keine Verknüpfungen von SQL-Abfragen zu Verzeichnissen herstellen.
User since
2006-07-10
2611
Artikel
BenutzerIn
PL/Perl erlaubt es eigene Funktionen und Datentypen mittels Perl in der Datenbank selber zu schreiben. So weit ich weiß kann das das mySQL nicht. Die Abfragen des Dateisystems liefe dann über Perl selber innerhalb der Datenbank.
Mehr dazu:
http://www.postgresql-support.de/pgbook/node394.html
User since
2003-08-21
2614
Artikel
ModeratorIn
Wegen der Synchronisationsprobleme beim ausserordentlichen Abbruch des Programms:
Man kann es ja aehnlich wie bei Maildir machen:
Zwei Verzeichnisse, meinetwegen "images" und "images-tmp". Die Bilder werden in "images-tmp" angelegt, der Datensatz wird angelegt, dann wird mit rename() (ist relativ atomar) das Bild nach "images" ruebergeschoben.
Da guckt man dann ab und zu Mal, ob in "images-tmp" noch Bilder mit alten Timestamps rumliegen, und dann muss man nur die mit der Datenbank abgleichen.