Frage

Es gibt einige sehr gute Fragen hier auf SO über die Dateiverwaltung und in einem großen Projekt zu speichern.

  

Speichern von Bildern in DB - Ja oder Nein
   Möchten Sie speichern binäre Daten in der Datenbank oder in der Datei System?

Die erste hat einige großartige Einblicke und in meinem Projekt habe ich beschlossen, die Datei Weg zu gehen und nicht die DB-Route.

Ein wichtiger Punkt gegen das Dateisystem verwendet, ist Backup. Aber in unserem System haben wir ein großes Backup-Schema, so dass ich mache mir keine Sorgen darüber.

Der nächste Weg ist, wie die tatsächlichen Dateien zu speichern. Und ich habe gedacht, über die Lage Dateien mit statischen zu allen Zeiten und erstellen Sie ein virtuelles Verzeichnis System in der Datenbank-Seite der Dinge. So Links auf die Datei nicht ändern.

Das System i baue wird eine globale Dateiverwaltung haben, so sind alle Dateien für alle Benutzer zugänglich. Aber viele, die die Datei Route Diskussion über physische Verzeichnisgröße gegangen sind (wenn alle Dateien in einem Verzeichnis zum Beispiel)

Also meine Frage ist, was sind einige Tipps oder Best-Practice-Methoden in Ordner für diese statischen Dateien erstellen, oder wenn ich nicht die virtuellen Verzeichnis Route überhaupt gehen sollte.

(das Projekt ist auf dem LAMP-Stack (PHP), wenn das überhaupt hilft)

War es hilfreich?

Lösung

Eine Möglichkeit ist eine eindeutige Nummer, die jede Datei zuweisen und es verwendet, die tatsächliche Speicherort der Datei zu suchen. Dann wird eine Sie verwendet, die Anzahl Dateien in verschiedenen Verzeichnissen im Dateisystem zu verteilen. Zum Beispiel könnten Sie so etwas wie dieses Schema verwenden:

/images/{0}/{1}/{2}

  

{0}: file_number % 100
  {1}: (file_number / 100) % 100
  {2}: file_number

Andere Tipps

Ich habe in dieses Problem läuft vor einiger Zeit für eine Website, die eine Menge von Dateien wurde Hosting. Was wir taten, war eine GUID nehmen (die auch das Primärschlüsselfeld einer Datei ist) (zB BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) und Speichern einer Datei wie folgt: / B / C / C / BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301 / filename.ext

Das hat gewisse Vorteile:

  • Sie können die Dateiserver über mehrere Server skalieren (und weisen bestimmte Verzeichnisse zu jedem)
  • Sie müssen nicht die Datei umbenennen
  • Ihre Verzeichnisse sind garantiert eindeutig sein

Hope, das hilft!

Um eine übermäßige Anzahl von Einträgen in einem einzigen Verzeichnis zu vermeiden erstellen, können Sie Verzeichnisse auf Teile des Dateinamen stützen zu schaffen. So zum Beispiel, wenn Sie eine Datei mit dem Namen d7f5ae9b7c5a.png haben, können Sie es speichern möchten, in Medien / d7 / f5 / d7f5ae9b7c5a.png. Wenn Ihre Dateinamen all hexadezimal sind, dann wird dies die Anzahl der Einträge in einem einzigen Verzeichnis auf 256 bis zur letzten Ebene beschränken.

  1. Ein Benutzer Bild ~ 100 kb, so lassen 10 000 Benutzer in der Datenbank haben, jeder Benutzer in durchschnittlich 5 Bilder haben, also werden wir 5 Terabyte DB haben, und jede Bildausgabe erfolgt über eine DB und diese ausgeführt werden Extra DB-Verkehr wird den allgemeinen DB-Server perfomance reduzieren. ... können Sie den DB-Cluster verwenden, um dies zu vermeiden, aber nehmen an, es ist teuer

  2. Anwenderbericht über Fehler auf Live-Datenbank (im Test - alles richtig funktioniert), wie würden Sie Dump erstellen ein entpacken Sie es auf die Entwickler-Maschine? Wie viel Zeit wird es dauern?

  3. In einem Moment können Sie entscheiden, Bilder auf einigen CDN zu setzen, was im Quellcode die Änderungen sein?

Ich nehme in der Regel diesen Ansatz:

Haben Sie eine globale Einstellungen Variable für Ihre Anwendung, die auf den Ordner verweist, in dem Sie hochgeladenen Dateien speichern. In Ihrer Datenbank speichern, um die relativen Pfade zu den Dateien (relativ zu dem, was die Einstellungen Variable auf).

Also, wenn eine Datei auf /www/uploads/image.jpg befindet, Ihre Einstellungen varible Punkte / www / uploads Ihre Datenbankzeile image.jpg hat. Dies ist eine flexible Art und Weise, dass Ihre Systeme Verzeichnisstruktur aus Ihrer Anwendung abkoppelt.

Weitere können Sie Dateispeicher in Verzeichnissen basierend auf fragmentieren, welche Datenbanktabellen beziehen sich diese auf. Sagen Sie bitte eine Tabelle user_reports haben und einen Tisch user_photos. Sie speichern die Dateien, die auf user_reports in / www / uploads / user_reports beziehen. Wenn Sie eine große Anzahl von Benutzer Uploads können Sie fragmentaion noch weiter umzusetzen. Sprich ein Benutzer lädt eine Datei auf 20.03.2009, wird die Datei report.pdf genannt wird, so dass Sie es bei /www/uploads/user_reports/2009/03/20/report.pdf speichern.

Ich kann nicht viel darüber sagen, wie Apache und PHP-Dateien zu verwalten, aber ich kann etwas über das Dateisystem ext3 sagen. ext3 scheinen keine Probleme mit einer großen Anzahl von Dateien im selben Verzeichnis zu haben. Ich habe es getestet mit bis zu einer Million Dateien. Stellen Sie sicher, dass die dir_index Option auf dem Dateisystem aktiviert ist, bevor Sie die Verzeichnisse zu erstellen. Sie können, indem Sie dump2fs überprüfen und ändern Sie diese Option durch tune2fs ausgeführt wird. Hashing die Dateien in einen Baum von Unterverzeichnissen können noch nützlich sein, weil Kommandozeilen-Tools nach wie vor Probleme Auflistung der Inhalt des Verzeichnisses haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top