2009-07-12 2 views
3

Zuerst habe ich festgestellt, es gibt viele Fragen in Bezug auf diese, viele als doppelt markiert.Sind Bildpfade in einer Datenbank notwendig?

Ich kam schließlich zu this one.

Und die akzeptierte Antwort für diese Frage löst zwar teilweise meine Frage, beantwortet aber nicht alles.

Meine Frage ist, ein Benutzer lädt ein Bild hoch. Ich speichere den Pfad in der Datenbank und die Image-Datei im Dateisystem. Allerdings mache ich 3 Kopien dieses Bildes (groß, mittel und klein). Alles in allem habe ich 4 Bilder - original, groß, mittel, klein.

Sollte ich alle vier Pfade in der Datenbank, wie so

ID |  original  | large  | medium  | small  | 
----+--------------------+-----------------+-----------------+----------------+ 
1 | /path/to/original | /path/to/large/ | /path/to/medium | /path/to/small | 

oder einfach nur den Pfad des ursprünglichen speichern, und geben Sie die anderen 3 eine Namenskonvention, etwa so: car.jpg, car.jpg, large-car.jpg, medium-car.jpg, small-car.jpg?

Ich fühle, dass dieser Weg weniger schwer auf der Datenbank wäre, und dass, wenn ich später eine andere Größe hinzufügen wollte (dh extra klein), ich die Datenbank nicht ändern müsste.

Antwort

7

Wenn alle Bilder in einer bestimmten Zeile am selben Ort leben, würde ich sagen, dass ihr Basispfad eine eigene Spalte sein sollte (anstatt den Basispfad immer vom vollständigen Pfad des Originalbildes abzuleiten).

Wenn alle Bilder in der Datenbank an der gleichen Stelle leben, speichern Sie den Basispfad in dieser Tabelle überhaupt nicht; haben Sie es in Code oder in einer globalen Konfigurationstabelle.

+0

Nun, es ist ein Blog. Jeder Benutzer hat sein eigenes Verzeichnis. Jedes Mal, wenn der Benutzer einen Blog mit Bildern macht, erstelle ich ein neues Verzeichnis mit der Blog-ID, und innerhalb dieses Verzeichnisses plane ich alle 4 Bilder zu speichern. – sqram

+0

Dann würde ich eine Konstante für die Eltern aller Verzeichnisse haben, 'define ('BLOG_IMAGE_BASE_PATH', '/ images/go/here')' oder was auch immer und im Idealfall eine Methode für das Benutzerobjekt ' Funktion getImagePath() {return BLOG_IMAGE_BASE_PATH. "/". $ this-> blogID; } ', und daraus Bildpfade zusammensetzen. – chaos

1

Sicher haben eine feste Benennungskonvention für die verschiedenen Größen des Originalbildes, dies hilft Ihnen beim Generieren bekannter Cache-Schlüssel, so dass Sie die Bilder in einigen Cache speichern können, wie Memcache, dies entlastet die db und Server Festplatte i/o

2

Scheint so, als ob Sie versuchen, die Datenbank zu stark zu nutzen. Wie wäre es stattdessen mit dieser Methode?

ImageID | UserID | name.. 
---------+---------+----- 
1  | 495  | car454.jpg 
2  | 495  | house.jpg 
3  | 44  | kittysmall.jpg 

Und speichern Sie alle Bilder an einem Ort.

IMAGES_PATH = "/ path/to/images"

und benennen Sie die Bilder von der ImageID (Auto Increment), so für das 5. Bild, es wäre 5.ori.jpg oder 5.large.jpg usw.

Auf diese Weise können Sie leicht sehen, wer welches Bild besitzt, und auch der Benutzer kann verschiedene Bilder mit demselben Dateinamen hochladen und muss sich nicht darum kümmern.

+0

Interessant. Aber würde diese Methode tatsächlich die Datenbank nicht überbeanspruchen? Ich meine, für jedes hochgeladene Bild würde es 4 Einfüge-Transaktionen machen. Wenn der Benutzer "car.jpg" hochlädt, würde ich die Größe in groß, mittel und klein ändern. so würde ich car.jpg, klein-car.jpg, groß-car.jpg und Medium-car.jpg in die Datenbank einfügen; im Gegensatz zum Einfügen von "car.jpg", und wenn ich alle 4 Bilder im Blog anzeigen möchte, würde ich einfach "small-", "large-", "medium-" an den ursprünglichen Bildnamen (car.jpg) anhängen) – sqram

+0

Keine Lyrae, du würdest immer noch nur einen Einsatz verwenden. Sie würden "car.jpg" einfügen und die automatisch inkrementierte ID als Ergebnis auswählen, sagen wir, es gibt "5" zurück. Sie würden dann "5-small.jpg", "5-medium.jpg" und "5-large.jpg" speichern. –

1

Verallgemeinern würde ich sagen, wenn Sie die Informationen neu erstellen können (weil die Basis immer gleich ist, gefolgt von dem Benutzernamen), speichern Sie es nicht in der Datenbank. Wenn Sie später das Verzeichnis, in dem Sie Bilder speichern, aus irgendeinem Grund ändern möchten, sind Sie in Schwierigkeiten.

0

Als geringfügige Änderung wäre ich versucht, die generierten Thumbnails usw. in einem anderen Pfad zu platzieren (zB: ../generated/), um sicherzustellen, dass das Quellbild nicht überschrieben wird, wenn jemand ein Datei namens 'car-large.jpg' usw.

+0

Nun, wenn jemand eine Datei namens "large-car.jpg" hochlädt, würde "large-" vorangestellt, und es würde "large-large-car.jpg" werden. – sqram

1

Wenn die spezifischen Pfade konsistent sind, außer für die Dateinamen, verwenden Sie keine Konstanten für die Pfade und speichern Sie die Bilder in den entsprechenden Verzeichnissen und verweisen Sie nur auf die Dateinamen in der Datenbank.

Das Hauptprinzip hier ist die Vermeidung von doppelten Informationen in der Datenbank und in Ihrem Code. Für die Datenbank erreichen Sie eine höhere Normalform und für den Code erreichen Sie DRY (Do not Repeat Yourself).

Angenommen, Sie Struktur ist so etwas wie

/home/user/site/images/Original/

/home/user/site/images/small/

/home/user/site/images/mittel/

/home/user/site/images/groß/

Sie Konstanten für diese Informationen verwenden könnten. z.B.

PATH_ORIGINAL =/home/user/site/images/Original/

PATH_SMALL =/home/user/site/images/small/

PATH_MEDIUM =/home/user/site/images/Medium/

PATH_LARGE =/home/user/site/images/groß/

in Ihrem Code Dann könnten Sie so etwas wie

Smallcar = PATH_TO_SMALL tun. car.jpg;

Oder fügen Sie einfach die entsprechende Konstante in die Abfrage ein, die Sie zum Laden der Bilder haben. Der zusätzliche Vorteil besteht darin, dass Sie einen Ort zum Ändern von Pfaden haben, wenn Sie Verzeichnisstrukturen optimieren oder Code zwischen Servern ändern müssen, statt eine ganze Reihe von Datenbankeinträgen zu aktualisieren, was problematischer und fehleranfälliger sein könnte.

+0

Bilder könnten auf diese Weise überschrieben werden, nein? – sqram

+0

Egal, welches Skript schreibt oder erstellt die Originale (ich gehe von einem Datei-Upload-Prozess aus), lassen Sie die Bilddateien setzen die Berechtigungen zum Lesen nur einmal geschrieben.Das sollte Sie vor Überschreibungen schützen. Aber dann müssten Sie jeden Versuch, in eine schreibgeschützte Datei zu schreiben, falsch behandeln. Eine andere gängige Technik ist, dass vor dem Speichern eine eindeutige Hash-Zeichenfolge an den Anfang des Dateinamens angehängt wird. Auf diese Weise sind alle neuen Dateien garantiert eindeutige Namen. Aber vielleicht missverstehe ich die ursprüngliche Absicht Ihrer Frage. –