Domanda

Ci sono alcuni molto buoni domande qui sul MODO sulla gestione di file e archiviazione all'interno di un grande progetto.

La memorizzazione delle Immagini nel DB - Sì o No?
Vuoi archiviare file binario di dati in un database o in un file di sistema?

Il primo, uno che ha alcune grandi intuizioni e nel mio progetto ho deciso di andare il file di rotta, e non il DB percorso.

Un punto importante contro usando il filesystem è di backup.Ma nel nostro sistema abbiamo una grande schema di backup, quindi non sono preoccupato.

Il percorso successivo è come memorizzare i file.E ho pensato di avere la posizione dei file statici a tutti i tempi e di creare un sistema di directory virtuali nel database lato delle cose.Così i link al file non cambiano.

Il sistema che sto edificio avrà una società globale di gestione dei file in modo che tutti i file sono accessibili a tutti gli utenti.Ma molti che sono andati il file percorso parlare di fisica directory dimensioni (se tutti i file sono all'interno di una directory, ad esempio)

Quindi la mia domanda è, che cosa sono alcuni consigli o metodi migliori nella creazione di cartelle per questi file statici, o se non dovrei andare la directory virtuale di percorso.

(il progetto è su stack LAMP (PHP) se che aiuta a tutti)

È stato utile?

Soluzione

Un modo è quello di assegnare un numero univoco per ogni file e ricercare l'effettiva posizione del file.Quindi è possibile utilizzare il numero di distribuire i file in diverse cartelle del filesystem.Per esempio, si potrebbe usare qualcosa di simile a questo schema:

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

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

Altri suggerimenti

Ho eseguito in questo problema qualche tempo fa per un sito web che ha ospitato un sacco di file.Quello che abbiamo fatto è stato prendere un GUID (che è anche il campo Chiave Primaria di un file (ad es.BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) e memorizzare in un file come questo:/B/C/C/BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301/filename.ext

Questo ha alcuni vantaggi:

  • Scalabilità server di file su più server (e assegnare directory specifiche per ognuna)
  • Non devi rinominare il file
  • Le directory sono garantiti per essere unico

Spero che questo aiuta!

Al fine di evitare la creazione di un numero eccessivo di voci in una singola directory, è possibile basare la creazione di directory su pezzi di un nome di file.Così, per esempio, se si dispone di un file di nome d7f5ae9b7c5a.png, è possibile che si desidera memorizzare in media/d7/f5/d7f5ae9b7c5a.png.Se i nomi di file sono tutti esadecimale quindi questo limita il numero di voci in una singola directory 256 fino al livello finale.

  1. Un utente di immagine ~ 100kb, quindi cerchiamo 10 000 utenti nel database, ogni utente sarà in media di 5 immagini, così avremo il 5 terabyte DB, e ogni immagine di output sarà eseguita tramite un DB e questo extra DB del traffico di ridurre il generale DB server perfomance....si può usare il DB cluster, per evitare questo, ma supponiamo che sia costoso

  2. Relazione di un utente su di errore sul database (su test tutto funziona correttamente), e come creare un dump di un scompattarlo sviluppatori di macchina?Quanto tempo ci vorrà?

  3. In un momento in cui si può decidere di mettere le immagini su alcuni CDN, quali saranno i cambiamenti nel vostro codice sorgente?

Io di solito un approccio di questo tipo:

Globale impostazioni variabile per l'applicazione che punti alla cartella in cui memorizzare i file caricati.Nel database per memorizzare i percorsi relativi al file (relativo a ciò che le impostazioni variabile di punti).

Quindi, se un file si trova in /www/uploads/image.jpg le impostazioni variabile di punti /www/uploads database riga image.jpg.Questa è una soluzione flessibile che consente di separare i sistemi struttura di directory dell'applicazione.

Inoltre, è possibile frammento di archiviazione di file in cartelle in base a cosa tabelle del database, che riguardano.Supponiamo di avere una tabella user_reports e una tabella user_photos.Si archiviano i file che si riferiscono a user_reports in /www/uploads/user_reports.Se si dispone di numerosi utente carica è possibile implementare fragmentaion ancora di più.Dire che un utente carica un file sul 20.03.2009, il file è denominato report.pdf, in modo da conservarlo in /www/uploads/user_reports/2009/03/20/report.pdf.

Non posso dire molto su come apache e PHP per gestire i file, ma posso dire qualcosa riguardo il file system ext3.ext3 non sembrano avere problemi con un gran numero di file nella stessa directory.Io l'ho testato con un massimo di un milione di file.Assicurarsi che il dir_index è attivata l'opzione di file di sistema prima di creare la directory.È possibile controllare l'esecuzione di dump2fs e modificare questa opzione, eseguendo tune2fs.L'hash del file in una struttura di sottodirectory, può ancora essere utile, perché strumenti a riga di comando può avere ancora problemi elencare il contenuto della directory.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top