Flat-File-Datenbanken haben ihren Platz und sind für die richtige Domäne recht brauchbar.
E-Mail-Server und NNTP-Server der Vergangenheit schoben wirklich die Grenzen, wie weit Sie diese Dinge wirklich nehmen können (was eigentlich ziemlich weit ist - Dateisysteme können Millionen von Dateien und Verzeichnissen haben).
Flat File DBs Die zwei größten Schwächen sind Indexierung und atomare Updates, aber wenn die Domain geeignet ist, sind diese möglicherweise kein Problem.
Aber Sie können, zum Beispiel, mit der richtigen Verriegelung, eine "atomare" Index-Update mit grundlegenden Dateisystem-Befehle, zumindest unter Unix.
In einem einfachen Fall wird der Indizierungsprozess durch die Daten ausgeführt, um die neue Indexdatei unter einem temporären Namen zu erstellen. Wenn Sie fertig sind, benennen Sie einfach die alte Datei über die neue Datei um (entweder den Systemaufruf umbenennen (2) oder den Befehl shell mv). Rename und MV sind atomare Operationen auf einem Unix-System (d. H. Es funktioniert entweder oder es nicht und es gibt nie einen fehlenden "Zwischenzustand").
Gleiches mit dem Erstellen neuer Einträge.Im Grunde schreiben Sie die Datei vollständig in eine temporäre Datei, benennen Sie sie dann um oder bringen Sie sie an ihren endgültigen Platz. Dann haben Sie nie eine "Zwischen" -Datei in der "DB". Andernfalls haben Sie möglicherweise eine Race-Bedingung (z. B. wenn ein Prozess eine Datei liest, die noch geschrieben wird und möglicherweise bis zum Ende des Schreibvorgangs zu Ende geht - hässliche Race-Bedingung).
Wenn Ihre primäre Indizierung gut mit Verzeichnisnamen funktioniert, funktioniert das problemlos. Sie können beispielsweise ein Hashing-Schema verwenden, um Verzeichnisse und Unterverzeichnisse zum Suchen neuer Dateien zu erstellen.
Das Finden einer Datei mit dem Dateinamen und der Verzeichnisstruktur ist sehr schnell, da die meisten Dateisysteme heute ihre Verzeichnisse indexieren.
Wenn Sie eine Million Dateien in einem Verzeichnis speichern, kann es zu Optimierungsproblemen kommen, in denen Sie suchen sollten, aber außerhalb dieser Box werden die meisten Zehntausende problemlos verarbeitet. Denken Sie daran, dass, wenn Sie das Verzeichnis durchsuchen müssen, viele Dateien zu scannen sind. Die Partitionierung über Verzeichnisse verhindert dies.
Aber das hängt alles von Ihren Indexierungs- und Suchtechniken ab.
Effektiv ist ein Vorrat aus dem Regal Web-Server, der statischen Inhalt dient eine große, flache Datei-Datenbank, und das Modell funktioniert ziemlich gut.
Schließlich haben Sie natürlich die Fülle von freien Unix-Dateisystem-Tools zur Verfügung, aber sie alle haben Probleme mit Zillionen von Dateien (Forking 1000000 grep, um etwas in einer Datei zu finden wird Performance-Kompromisse haben - der Aufwand summiert sich einfach).
Wenn sich alle Dateien auf demselben Dateisystem befinden, bieten feste Links auch Optionen (da sie ebenfalls atomar sind), die dieselbe Datei an verschiedenen Stellen ablegen (im Prinzip für die Indexierung).
Zum Beispiel könnten Sie ein "Heute" -Verzeichnis, ein "Gestern" -Verzeichnis, ein "Java" -Verzeichnis und das eigentliche Nachrichtenverzeichnis haben.
So könnte ein Beitrag im "today" -Verzeichnis, dem "java" -Verzeichnis (weil der Beitrag mit "java" getaggt ist, sagen wir) und an seinem endgültigen Platz (say/articles/2008/12) verlinkt werden /01/my_java_post.txt). Um Mitternacht führen Sie dann zwei Prozesse aus. Der erste nimmt alle Dateien im "today" -Verzeichnis, überprüft ihr Erstellungsdatum, um sicherzustellen, dass sie nicht "heute" sind (da der Prozess einige Sekunden dauern kann und eine neue Datei eingeschleust wird), und benennt diese Dateien in " gestern". Als nächstes machen Sie dasselbe für das "gestern" -Verzeichnis, nur hier löschen Sie es einfach, wenn sie veraltet sind.
Inzwischen befindet sich die Datei noch im Verzeichnis "java" und ".../12/01". Da Sie ein Unix-Dateisystem und feste Links verwenden, existiert die "Datei" nur einmal, das sind alles nur Zeiger auf die Datei. Keiner von ihnen ist "die" Datei, sie sind alle gleich.
Sie können sehen, dass, während jede einzelne Datei bewegen atomaren ist, ist die Masse nicht. Während zum Beispiel das "today" -Skript läuft, kann das "gestern" -Verzeichnis durchaus Dateien sowohl von "gestern" als auch "vom Vortag" enthalten, weil das "gestern" -Skript noch nicht ausgeführt wurde.
In einer transaktionalen DB würden Sie das alles auf einmal tun.
Aber einfach, es ist eine bewährte Methode. Insbesondere Unix arbeitet sehr gut mit diesem Idiom und die modernen Dateisysteme können es auch sehr gut unterstützen.
Bitte verdeutlichen Sie Ihr Verständnis des Unterschieds zwischen einer "flachen Datei" und einer "Dateisystem-basierten" Datenbank. Ansonsten kann die Frage nicht beantwortet werden. –
Ausgezeichneter Punkt, im Falle dieser Frage würde ich "Flat-Datei == Dateisystem-basierte" sehen. Zum Beispiel würde jeder Blog-Eintrag und die zugehörigen Metadaten in einer einzigen Datei sein. Für viele Dateien nach Datum Struktur der Dateiordner organisiert (Blogs \ testblog2 \ 2008 \ 12 \ 01) == 12/01/2008 –