Beste Strategie für das speichern von Dokumenten in SQL Server 2008
Eines unserer teams wird die Entwicklung einer Anwendung zur Speicherung von Datensätzen in einem SQL2008 Datenbank und jeden dieser Einträge wird die zugehörige PDF-Datei. Es gibt derzeit über 340GB von Dateien, die mit den meisten (70%) wird über 100K, aber einige sind mehrere Megabyte groß. Daten werden meist eingelegt und Lesen, aber die Dateien sind aktualisiert, bei Gelegenheit. Wir debattieren Sie zwischen den folgenden Optionen:
-
Speichern Sie die Dateien als BLOBs in der Datenbank.
-
Speichern Sie die Dateien außerhalb der Datenbank und speichern die Pfade in der Datenbank.
-
Verwenden SQL2008 die Filestream-Funktion um die Dateien zu speichern.
Haben wir gelesen das Micrsoft best practices in Bezug auf filestream-Daten, aber da die Dateien variieren in der Größe, sind wir nicht sicher, welchen Weg zu wählen. Wir sind Neigung zu option 3 (filestream), haben aber einige Fragen:
-
Welche Architektur würden Sie sich entscheiden angesichts der Datenmenge und Dateigrößen oben erwähnt?
-
Daten wird der Zugriff erfolgt über SQL-Authentifizierung, nicht die Windows-Authentifizierung, und der web-server wird wahrscheinlich nicht in der Lage sein, um Zugriff auf die Dateien mithilfe der Windows-API. Würde dieses machen filstream schlechter als die anderen beiden Optionen?
-
Da die SQL-backups enthalten die filestream-Daten, dies führt zu sehr großen Datenbank-backups. Wie andere behandeln das sichern von Datenbanken mit einer großen Menge von filestream-Daten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, hier wir gehen. Option 2 ist eine wirklich schlechte Idee - Sie am Ende mit unüberprüfbare Integritätsbedingungen und sicherungen, die sind nicht unbedingt konsistent sein, per definition, denn Sie können nicht den Zeitpunkt der sicherungen. Kein problem in den MEISTEN Szenarien, es verwandelt sich in einem moment haben Sie eine kompliziertere (point in time) recovery.
Optionen 1 und 3 sind ziemlich gleich, wenn auch mit einigen Implikationen.
OTOH die Dateien zählen nicht als db-Größe (express edition - nicht gegen die 10gb Grenze sollte Sie es) und der Zugang ist weiter unten möglich mit einem file-share. Dies wird zusätzliche Flexibilität.
In der Datenbank hat die begrenzten Möglichkeiten in Bezug auf den Zugang (keine Möglichkeit für den web-server öffnen Sie einfach die Datei nach dem abrufen des Pfads, der aus der sql - hat es in den Trichter die komplette Datei mit den sql-Protokoll-Ebene), hat aber Vorteile in Bezug auf weniger Dateien (zahlen). Setzen Sie die blobs in eine separate Tabelle und eine separate spindles kann strategisch eine gute Idee.
Bezug auf Ihre Fragen:
1: ich gehe mit in die Datenbank Speicher. Probieren Sie beide - filestream und nicht. Sie verwenden die gleiche API wie auch immer, dies ist eine einfache änderung in der Tabelle definition.
2: ja, noch schlimmer als direkter Datei-Zugriff, aber es wäre mehr geschützt als direkter Datei-Zugriff. Ansonsten glaube ich nicht das filestream-und blob-einen signifikanten Unterschied machen.
3: wo haben Sie eine riesige backup hier? Tut mir Leid zu Fragen, aber Ihre 340gb ist nicht genau eine große Datenbank. Und Sie brauchen, um es wieder SOWIESO. Besser machen es in einem konsistenten Zustand, was man erreichen mit db-storage. Plus Integrität (niemand versehentlich löschen nicht verwendeter Dokumente ohne Bereinigung der Datenbank). Die DB ist nicht wesentlich größer als das zu tun, dass die split, und es ist eine einfache Ort Sicherung.
Am Ende, die Frage ist db-Integrität und Leichtigkeit zu sichern, die Dinge. Sieg für SQL Server, wenn man eine große - und das heißt 360 terabyte an Daten.
Speichern Sie die Dateien außerhalb der Datenbank und speichern die Pfade in der Datenbank.
weil es dauert zu viel Platz zum speichern von Dateien in der Datenbank.
Ich würde definitiv empfehlen (3) - dies ist die Art von Szenario, dass dieses feature ist speziell gebaut, um zu behandeln, und es ist sehr gut verarbeitet meiner Meinung nach.
Diesem white paper hat viele nützliche Informationen - http://msdn.microsoft.com/en-us/library/cc949109(SQL.100).aspx - und aus der Sicht der Sicherheit erwähnt, dass...
Hinsichtlich der Sicherungen, siehe die akzeptierte Antwort auf diese Frage - SQL Server-FILESTREAM-Einschränkung
Ich habe eine Index/Inhalt-Methode, die Sie noch nicht aufgeführt, aber es könnte helfen. Sie haben eine Tabelle von gespeicherten Dateien als blob Binär-code mit einer eindeutigen id oder Zeilennummer. Die nächste SQL-Tabelle gibt den index, den Namen der Datei, den Pfad zu, keywords, Datei-Typ, Datei-Größe, Prüfsumme... was auch immer Sie brauchen. Dies ist die beste, die ich gesehen habe, zu speichern, Dateien für die Arbeit mit tausenden von hochgeladenen Dokumenten. Der index ist erforderlich, um die Datei anzuzeigen, wie würde es nur werden binäre text für den Benutzer, wenn Sie keine Ahnung haben, was die Datei-Typ ist. Wir speichern die Daten in 2 verschiedenen Datenbanken zu ermöglichen, wird der index auf einem server, und die Datei speichern, auf mehreren Servern für die einfache Erweiterung. An diesem Punkt wird der index-Tabelle/- Datenbank enthält den Namen oder die Schlüssel auf dem server befindet sich die Datei auf. Wenn der Benutzer Zugriff hat, zu Lesen, dass insbesondere die index-Tabelle ist, dann haben Sie Zugriff auf die Datei.
Haben Sie sich bei der RBS (Remote Blob Storage) - Lösung? Wenn Sie die Filestream-RBS-Anbieters, es wird intern halten Sie Ihre blobs als Filestream-Dateien oder varbinary(max) - Werte, je nachdem, was besser wird, Leistungen auf der Grundlage der blob-Größe.
Remote-BLOB-Speicher-Anbieter-Bibliothek Implementierung Spezifikation
SQL-Remote-Blob-Speicher-Teamblog
Diesem Szenario ist ganz einfach: die FILESTREAM-Empfehlung gesagt, dass ist am besten, wenn die Dateien (im Durchschnitt) größer als 1 MB, das ist nicht Ihr Fall, für kleinere Objekte, vom Typ varbinary(max) - BLOBs in der Datenbank oft bietet eine bessere streaming-performance.
Da werden Sie accesing die Dateien direkt vom SQL Server und nicht aus dem filesystem, dann speichern Sie es mit BLOBs.
Lesen, Wenn FILESTREAM: http://technet.microsoft.com/en-us/library/bb933993%28v=sql.105%29.aspx