I database di file flat hanno la loro posizione e sono abbastanza utilizzabili per il dominio corretto.
I server di posta e server NNTP del passato hanno davvero spinto i limiti di quanto realmente si possano prendere queste cose (che in realtà è piuttosto lontano - i file system possono avere milioni di file e directory).
I DB di file flat due punti deboli principali sono gli aggiornamenti di indicizzazione e atomici, ma se il dominio è adatto, questi potrebbero non essere un problema.
Ma è possibile, ad esempio, con un blocco appropriato, eseguire un aggiornamento dell'indice "atomico" utilizzando i comandi di base del file system, almeno su Unix.
Un caso semplice sta avendo il processo di indicizzazione in esecuzione attraverso i dati per creare il nuovo file di indice con un nome temporaneo. Quindi, una volta terminato, è sufficiente rinominare (il nome di sistema rinominare (2) o il comando shell mv) il vecchio file sul nuovo file. Rinominare e mv sono operazioni atomiche su un sistema Unix (cioè funziona o non funziona e non c'è mai uno "stato intermedio" mancante).
Uguale alla creazione di nuove voci.Fondamentalmente scrivere il file completamente in un file temporaneo, quindi rinominarlo o inserirlo nella sua posizione finale. Quindi non hai mai un file "intermedio" nel "DB". Altrimenti, potresti avere una condizione di competizione (come un processo che legge un file che è ancora in fase di scrittura, e potrebbe arrivare alla fine prima che il processo di scrittura sia completato - condizioni di corsa brutte).
Se l'indicizzazione primaria funziona bene con i nomi di directory, allora funziona perfettamente. È possibile utilizzare uno schema di hashing, ad esempio, per creare directory e sottodirectory per individuare nuovi file.
Trovare un file usando il nome del file e la struttura della directory è molto veloce dato che la maggior parte dei file system oggi indicizza le proprie directory.
Se stai mettendo un milione di file in una directory, potrebbero esserci dei problemi di tuning a cui vorresti dare un'occhiata, ma da quella scatola molti ne gestiranno facilmente 10 di migliaia. Ricorda che se hai bisogno di SCAN la directory, ci saranno un sacco di file da scansionare. Il partizionamento tramite le directory aiuta a impedirlo.
Ma tutto dipende dalle tecniche di indicizzazione e ricerca.
In modo efficace, un server Web di riserva disponibile per scaffale che serve contenuti statici è un database di file grandi e piatti, e il modello funziona piuttosto bene.
Infine, naturalmente, hai a disposizione la pletora di strumenti a livello di file system Unix gratuiti, ma tutti hanno problemi con milioni di file (la foratura di grep 1000000 volte per trovare qualcosa in un file avrà un compromesso in termini di prestazioni - l'overhead si aggiunge semplicemente).
Se tutti i file si trovano sullo stesso file system, anche gli hard link offrono opzioni (poiché anch'esse sono atomiche) in termini di inserimento dello stesso file in posizioni diverse (in pratica per l'indicizzazione).
Ad esempio, è possibile avere una directory "oggi", una directory "ieri", una directory "java" e la directory dei messaggi effettiva.
Quindi, un post può essere collegato nella directory "today", la directory "java" (perché il post è taggato con "java", ad esempio), e nella sua posizione finale (ad esempio/articles/2008/12 /01/my_java_post.txt). Quindi, a mezzanotte, esegui due processi. Il primo prende tutti i file nella directory "today", controlla la loro data di creazione per assicurarsi che non siano "attuali" (dato che il processo può richiedere alcuni secondi e un nuovo file potrebbe introdursi) e li rinomina in " ieri". Successivamente, fai la stessa cosa per la directory "ieri", solo che qui semplicemente li elimini se non sono aggiornati.
Nel frattempo, il file si trova ancora nella directory "java" e ".../12/01". Dato che stai utilizzando un file system Unix e collegamenti reali, il "file" esiste solo una volta, questi sono solo dei puntatori al file. Nessuno di loro è "il" file, sono tutti uguali.
Si può vedere che mentre ogni singolo spostamento di file è atomico, il grosso non lo è. Ad esempio, mentre lo script "oggi" è in esecuzione, la directory "ieri" può contenere file sia di "ieri" che di "il giorno prima" perché lo script "ieri" non è ancora stato eseguito.
In un DB transazionale, lo si farebbe tutto in una volta.
Ma, semplicemente, è un metodo provato e vero. Unix, in particolare, funziona molto bene con quell'idioma, e anche i moderni file system possono supportarlo abbastanza bene.
Si prega di chiarire la propria comprensione della differenza tra un "file flat" e un database "basato su file system". Altrimenti, la domanda non può essere risolta. –
Punto eccellente, nel caso di questa domanda vedrei "File flat == basato su file system" Ad esempio, ogni post di blog e i relativi metadati di accompagnamento sarebbero in un singolo file. Creazione di molti file organizzati per struttura delle date delle cartelle di file (blog \ testblog2 \ 2008 \ 12 \ 01) == 12/01/2008 –