2009-07-08 6 views
4

Ich arbeite an einer Content-Management-Anwendung, in der die Daten, die in der Datenbank gespeichert werden, extrem generisch sind. In diesem speziellen Fall verfügt ein Container über viele Ressourcen, und diese Ressourcen werden einer Art von digitalem Asset zugeordnet, egal ob es sich dabei um ein Bild, einen Film, eine hochgeladene Datei oder sogar reinen Text handelt.diene mein Text aus dem Dateisystem anstelle einer Datenbank?

Ich habe seit einer Woche mit einem Kollegen streiten, weil zusätzlich zum Speichern der Bilder, etc - sie die Text-Assets auf dem Dateisystem speichern möchten und die Anwendung den Speicherort (aus der Datenbank) nachschlagen) und lesen Sie die Textdatei (aus dem Dateisystem) vor dem Servieren an die Client-Anwendung.

Der gesunde Menschenverstand schien mich zu schreien, dass dies lächerlich war und wenn wir uns Mühe geben, etwas aus der Datenbank nachzuschlagen, könnten wir den Text genauso gut in einer Datenbankspalte speichern und zusammen mit der Zeilensuche bereitstellen. Database Lookup + File IO schien unkontrollierbar langsamer als nur Database Lookup. Nachdem ich einige Zeit hin und her gegangen bin, habe ich beschlossen, einige Benchmarks zu fahren und die Ergebnisse ein wenig überraschend zu finden. Die Benchmark-Zeiten scheinen sehr wenig konsistent zu sein. Der einzige eindeutige Gewinner in den Benchmarks war das Ziehen eines großen Datensatzes aus der Datenbank und das Iterieren der Ergebnisse, um das Text-Asset anzuzeigen. Das Ziehen von Objekten nacheinander aus der Datenbank und das Anzeigen ihres Textinhalts scheint jedoch Kopf an Kopf zu liegen.

Jetzt kenne ich die Grenzen der Benchmarks laufen, und ich bin mir nicht sicher, ob ich sogar die richtige Idee von "Tests" (zum Beispiel, Dateisystem-Schreiben sind lächerlich schneller als Datenbank schreibt, wusste das nicht!) . Ich denke, meine Frage dient zur Bestätigung. Ist Datei-E/A vergleichbar mit dem Speichern/Suchen von Datenbank-Text? Fehle mir hier ein Teil des Arguments? Vielen Dank im Voraus für Ihre Meinung!

Eine schnelle Arbeit über das, was ich benutze: Dies ist eine Ruby on Rails-Anwendung, Rubin 1.8.6 und Sqlite3 verwenden. Ich plane beim Verschieben der gleichen Codebasis zu MySQL morgen und sehen, ob die Benchmarks gleich sind.

+0

I haven Ich habe solche Tests nicht selbst gemacht, aber ich frage mich, wie das Dateisystem mit vielen vorhandenen Dateien abschneidet. Letztendlich ist das Dateisystem auch nur eine Art Datenbank. Was ich an "echten" Datenbanken mag, ist die Transaktionsverarbeitung/atomare Inserts. Irgendwie bin ich mit dem Dateisystem paranoid und befürchte, dass Schreibvorgänge mitten in einer Operation abstürzen und die gesamte Datei in einem fehlerhaften Zustand belassen. sagte, dass ich denke, große „dumme“ Dateien setzen (wie Bilder) auf dem Dateisystem und speichert nur die Dateinamen in der db ist ein gemeinsamer Ansatz. Versuchen Sie jedoch, den Webserver direkt zu bedienen. –

Antwort

1

Ich denke, dass Ihre Benchmark-Ergebnisse davon abhängen, wie Sie die Textdaten in Ihrer Datenbank speichern. Wenn Sie es als LOB speichern, wird es hinter den Kulissen in einer normalen Datei gespeichert. Mit jeder Art von LOB zahlen Sie die Datenbanksuche + File IO trotzdem.

VARCHAR wird in den Tabellen

Ordinary Text-Datentypen (VARCHAR et al) in typischen relationalen Datenbanksystemen in der Größe sind sehr begrenzt gespeichert. Etwas wie 2000 oder 4000 (Oracle) manchmal 8000 oder sogar 65536 Zeichen. Einige Datenbanken unterstützen den Langtext aber these have serious drawbacks and are not recommended.

LOB sind Referenzen Systemobjekte

Wenn der Text größer müssen Sie verwenden, um ein LOB-Datentyp (z CLOB in Oracle) einzureichen. Die LOBs funktionieren normalerweise folgendermaßen: Die Datenbank speichert nur einen Verweis auf ein Dateisystemobjekt Das Dateisystemobjekt enthält die Daten (z. B. die Textdaten). Dies ist sehr ähnlich zu dem, was Ihr Kollege vorschlägt, außer das DBMS hebt die schwere Arbeit von Verwalten von Referenzen und Dateien.

Die Quintessenz ist: Wenn Sie Ihren Text in einem VARCHAR speichern können, dann gehen Sie dafür. Wenn Sie nicht zwei Optionen haben können: Verwenden Sie ein LOB oder speichern Sie die Daten in einer Datei, auf die von der Datenbank verwiesen wird. Beide sind technisch ähnlich und langsamer als VARCHAR.

+0

Da die Datenbank, die wir verwenden werden, ist mysql5, das ist die Dokumentation, die ich übergib. Diese Seite: http://dev.mysql.com/doc/refman/5.1/en/char.html scheint anzuzeigen, dass die maximale Zeichenlänge theoretisch auf 65.535 eingestellt werden könnte ... was weit über die von Ihnen angegebenen Längen hinausgeht ... obwohl diese 65.535 Bytes sind und ich bin nicht sicher, was die Umwandlung ist, wenn es um Unicode geht, die ich untersuchen muss. Denkst du, dass Strings in einem Nicht-LOB (Textfeld in MySQL) gefährlich sein könnten? – BushyMark

+0

Ich fragte mich, wie Unicode selbst behandelt wird. Wenn es als utf-8 gespeichert ist, dann ist ein Zeichen maximal 4 Bytes lang, 1 Byte pro Zeichen ist typisch für englischen Text. Eine Gefahr, die ich mit wirklich großen VARCHARS in MySQL sehe, ist, dass es die maximale Zeilengröße (65.535 Bytes, die unter allen Spalten geteilt wird) füllen kann. Für einen Performace Vergleich zwischen TEXT und VARCHAR in MySQL siehe http://forums.mysql.com/read.php?24,105964,105964 Diese –

3

Der große Vorteil Sie nicht mit dem Dateisystem bekommen, ist, dass die Datenbank ordnungsgemäß gleichzeitigen Zugriff verwalten. Sagen wir 2 Prozesse müssen den gleichen Text wie gleichzeitig synchron mit dem Dateisystem ändern, kann zu Rennbedingungen führen, während Sie kein Problem mit everyhing in der Datenbank haben.

+0

ist große Informationen, danke! – BushyMark

0

tat ich dies vor. Es ist ein Durcheinander, Sie müssen das Dateisystem und die Datenbank ständig synchron halten, so dass die Programmierung komplizierter wird, wie Sie vermuten würden. Mein Ratschlag ist entweder eine Lösung für alle Dateisystem oder jede Datenbanklösung, abhängig von den Daten. Insbesondere, wenn Sie viele Suchen, bedingten Datenabruf benötigen, dann gehen Sie für die Datenbank, sonst fs. Beachten Sie, dass die Datenbank möglicherweise nicht für die Speicherung großer Binärdateien optimiert ist. Denken Sie immer daran, wenn Sie beide verwenden, müssen Sie sie synchronisiert halten, und es ist nicht für eine elegante noch genießbare (zu programmieren) Lösung. Viel Glück!

0

Zumindest, wenn Sie Ihre Probleme aus der "Leistungsseite" kommen, könnten Sie eine "keine SQL" Speicherlösung wie Redis (via Ohm, zum Beispiel) verwenden, oder CouchDB ...

Verwandte Themen