Bilder in der Datenbank vs. Dateisystem
Haben wir ein Projekt kommen, wo wir eine ganze backend-CMS-system, macht unsere gesamte extranet und intranet mit einem Paket. Die Frage, die ich habe versucht, eine Antwort darauf zu finden ist, was besser ist: die Speicherung von Bildern in der Datenbank (SQL Server 2005), so können wir die Integrität, single-Replikation planen, etc ODER Speicherung auf dem Dateisystem?
Einem Problem, das wir haben ist, dass wir mehrere Server haben die ein Lastenausgleich erfordern, um die gleichen Daten zu allen Zeiten. Ab jetzt müssen wir die SQL-Replikation kümmert, dass aber die Datei-Replikation zu sein scheint, ein wenig härter. Eine weitere Sorge, die wir haben ist, wir würden gerne mehrere Auflösungen desselben Bildes, wir sind nicht sicher, ob das erstellen und speichern, die jede version auf dem Datei-system wäre am besten, oder vielleicht dynamisch ziehen und die Erstellung der resolution, die wir gerne auf Anfrage.
Unsere Bedenken sind die mit der folgenden:
- Datenintegrität
- Daten-Replikation
- Mehrere Auflösungen
- Geschwindigkeit der Datenbank vs. Dateisystem
- Overhead laden der Datenbank vs. Dateisystem
- Daten-management-und backup
Hat jemand eine ähnliche situation oder eine Eingabe auf, was zu empfehlen wäre? Vielen Dank im Voraus für die Hilfe!
- Repost: stackoverflow.com/questions/3748/...
- diese Frage war sehr allgemein, diese Frage ist sehr spezifisch auf seine Bedürfnisse, und enthält eine Erläuterung seiner Umgebung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es war eine schöne Forschungsarbeit, veröffentlicht von Microsoft Research namens Blob-oder nicht-Blob, wo Sie sahen sich an alle Arten von Variablen und Auswirkungen.
Ihre Suche am Ende:
Da, dass das Papier veröffentlicht wurde, hat SQL Server 2008 fügte auch die FILESTREAM-Attribut, das macht die Speicherung Zeug in der Datei-system, sondern unter der Transaktions-Kontrolle, eine Realität. Dringend empfohlen Sie, dass der check out!
Diese Frage kommt oft - siehe diese SO suchergebnis.
Gibt es keine richtige Antwort - es hängt von Umständen.
Persönlich - halten Sie eine Datei Pfad in der DB und die Datei in das Dateisystem. Jeder hat seine eigenen stärken. Sie können backup-Dateien sowie Datenbanken. Dies ist auch das Fazit von dieser Kerl, wer verwaltet TB Daten.
Replikation von statischen Dateien, vor allem über eine Reihe von Servern, kann schwer zu bewältigen sein. Es kommt wirklich darauf an, einen Kompromiss zwischen Verwaltung, monitoring-und debugging-Replikation Probleme vs. die Größe der Datenbank und laden.
Ich denke, ich würde wahrscheinlich wählen die Datenbank-Ansatz, und bei Belastung wurde ein Problem betrachten, das aufstellen eine Art von cache-Ebene rund um das Bild macht.
Vorschläge zu speichern, wird der Pfad in der db sind, fehlt das eigentliche problem, die replizieren diese auf mehreren Rechnern.
Ihre Anliegen zerfallen in zwei Lager. Folgende Aspekte begünstigen die Speicherung der Dokumente in der Datenbank:
Diese Bedenken (wahrscheinlich) zugunsten Speicherung der Dokumente auf die Datei-system:
So, zu entscheiden, welche Angelegenheiten am meisten, und wählen Sie entsprechend.
Gut, wenn Ihre beiden top-Bedürfnisse sind die Integrität und die Replikation, dann ist die Antwort definitiv DB.
Du andere Punkte aber:
Integrität - DB, das ist, warum Datenbanken existieren vs. flat-file-Systeme.
Replikation - Nicht sicher, ob Sie meine Bild-Replikation, aber wenn das so ist, dann natürlich DB, so werden Sie nicht load balancing diese, sicherlich.
Mehrere Auflösungen ausgeführt werden können aus dem DB-Bild, aber dies fügt der Verarbeitung Kosten. Auch, je höher die Auflösung, desto größer die Größe, desto länger wird das Netzwerk warten. Mehrere Auflösungen trades Raum für die Geschwindigkeit.
Geschwindigkeit - Je nach Zugriff auf die Bilder, die es werden könnten, vernachlässigbar. Wenn Sie die Bilder in eine Datei zu teilen, müssen Sie warten auf das Netzwerk und das Netzwerk ist so ziemlich immer der Flaschenhals.
Overhead - Ehrlich gesagt, es hängt von Ihrer definition von overhead-und wie Sie den Zugriff auf die Bilder.
Management, DB, Hände nach unten. Singular storage = Eine Sorge weniger, und Sie sollte immer ausgeführt werden, backups für die Datenbank in jedem Fall. Dateisystem-backups über mehrere Server ist teuer, in vielerlei Hinsicht.
Gibt es triftige Anliegen, die auf beiden Seiten der Debatte, so geben Sie immer Ihre Anforderungen. Wie viel Daten, wie viele Bilder, wie groß?
Inline - /BLOB-Speicher
Kopf: vereinfacht die Architektur und Umsetzung, vereinfacht die Sicherung und Wiederherstellung oder migration des Systems; nur ein dump, backup, export (wie auch immer der Begriff für Ihren Geschmack zu DB) und verschieben Sie es an die neue Datenbank. Version control /Konsistenz erfolgt durch die DB, so können für die point-in-time-recovery. Security /access control ist auch sauberer, da der Zugang zu ein Bild-BLOB immanent ist, um den Zugang zu der gesamten Reihe. Verschieben Sie das Bild außerhalb der DB, und lassen Sie den HTTP-server Holen es nach oben, während besser für die Parallelität und Skalierbarkeit, können Probleme mit der Gewährleistung die Menschen nicht hack URLs und fordern Sie Bilder, die Sie nicht besitzen. Wenn Sie Ihnen Haus außerhalb der DB, stellen Sie sicher, dass entweder Ihre Sicherheitspolitik umfasst Zugriffssteuerung der Bilder zwischen den Nutzern. Entweder Ihr HTTP-server-Authentifizierung Integration mit dem Gesamt-system die Authentifizierung, oder Ihre HTTP-server-Programm, die bis dient der Bilder setzt eine Art des session-Mechanismus, um die HTTP-Anforderung gültig ist. Dies ist eine sehr große Sorge in multi-tenant-Datenbanken. Weniger ein Problem in der single-purpose, single-tenant-Systeme, die mit einfachen Authentifizierung.
Nachteil: Für wirklich große Datenbanken, backup und recovery wird frustrierend, oder sogar problematisch und teuer, da, wo Sie vielleicht einen kleinen core dataset andernfalls müssen Sie möglicherweise viele GB oder TB an Bilddaten. Behandeln Sie es alle als eine konsistente Datenbank ist sowohl der guten als auch von Integrität Sicht, aber schlecht für backups, es sei denn, Sie verwenden DBMS mit enterprise quality, data warehouse abgestimmt backup und recovery (Beispiel ist Oracle RMAN-und rolling-backups).
Immer überlegen, Zeit, um recovery in einem system. Wenn Ihre storage-Anforderungen < ein paar Gigabyte, sagen wir 50-100GB auch, und Sie haben genügend Speicherplatz für die Sicherung geplant, inline-Speicher-Reiniger ist. Vor allem die Trennung von Bedenken, und lassen Sie den Dateisystem-seine Arbeit wird zu einem wichtigen Vorteil. Nichts ist schlimmer, als zu versuchen, wiederherstellen, wiederherstellen und öffnen Sie eine riesige Datenbank für den Willen einer kleinen Daten-Fehler. Recovery-Zeit wäre meine größte Sorge.
Im Allgemeinen, anhaltenden image-Daten in die DB vielleicht nicht so effizient wie das Dateisystem, soweit es um ein CMS geht. An eine Zeit, die Sie wahrscheinlich wollen einfach nur, um das Bild anzuzeigen, statisch, zu anderen Zeiten, die Sie wollen, dass Bild zur Verfügung stehen, um Ihre Grafik-Designer für updates etc.
Betrachten Sie die Verarbeitung von overhead mit abrufen das Bild jedes mal, wenn Sie mit ihm arbeiten wollen.
Ein paar Punkte, warum sollten Sie das Dateisystem
Sie profitieren von proxy-caching
Bilder etc
Vorausgesetzt, Sie sind in einer windows-Umgebung ist es kein großer Grund für die Verwendung von Datei-system. Möchten Sie vielleicht vorsichtig sein, wie Sie speichern die Bilder in den Tabellen zu vermeiden, die unerwünschte Seite teilt, aber das ist ein performance-tweak, nicht ein riesiges Problem.
Nachteile Dateisystem
Nicht automatisch repliziert
Mai erschweren Ihre Replikation durch verschiedene physische Standorte, die für jede Instanz
-Langsam, mit einer sehr großen Anzahl von Dateien
Kopf auf das Dateisystem
-Wenn Sie die Speicherung von ein paar sehr großen Dateien, es wird ein bisschen besser.
Ich würde;
1) eindeutige Bezeichner (GUID) wird für jedes Bild
2) Tag/Name des Bildes mit dieser GUID
3) Lagern Sie die GUID in das Betriebssystem (Dateisystem)
4) Speichern Sie vollqualifizierten Namen (FQN) Zeiger in der Datenbank.
Speichern von Bildern in der Datenbank ist zu teuer in Bezug auf die Lagerung und Wartung. Speichern nur den FQN-Zeiger würde die bessere Lösung. Sie können auch die Erstellung von back-end-Integritätsprüfung durch Trigger und gespeicherte Prozeduren.
Ich würde nicht speichern Sie Ihre Bilder in die Datenbank für ein Grund (meine Antwort kommt vom sql-server):
Ich würde nicht wollen, dass SQL Server-Daten-Cache, Bevölkert von einfachen Bildern für die Website. Ich will den Daten-cache, um tatsächlich Daten in es. Auch wenn Sie eine multi-Tier-Architektur ist es viel einfacher, übergeben Sie eine URL für ein Bild als ein blob von binären Daten. Wo Sie laufen in Probleme wenn Sie möchten, dass nur bestimmte Personen die Bilder zu sehen (Sicherheit).