22 Stimmen

Speichern von PDF-Dateien als binäre Objekte in SQL Server, ja oder nein?

Ich muss eine Designentscheidung für die folgende Aufgabe finden:

Ich habe eine SQL Server-Datenbank und sie enthält eine Tabelle von Bestellungen. PDF-Dokumente werden von Benutzern über einen einfachen Dateiupload von einer Webseite aus hochgeladen und einer Bestellung zugeordnet. Es gibt nicht mehr als ein Dokument pro Bestellung (vielleicht kein Dokument, niemals mehr als eins). Zu diesem Zweck öffnet ein Benutzer eine Webseite, gibt eine Bestellnummer ein, ruft die Bestellung ab und klickt auf eine Schaltfläche zum Hochladen. So weiß ich, zu welcher Bestellung das hochgeladene Dokument gehört.

Jetzt überlege ich zwei Optionen, um die Dokumente auf dem Webserver zu speichern:

1) Erweitere meine Tabelle der Bestellungen um eine Spalte vom Typ varbinary(MAX) und speichere das PDF-Dokument direkt in diesem binären Feld.

2) Speichere die PDF-Datei in einem spezifischen Ordner auf der Festplatte und gebe ihr einen eindeutigen Namen in Bezug auf die Bestellung (zum Beispiel meine Bestellnummer, die ein Primärschlüssel in der Datenbank ist, oder eine GUID, die ich in einer zusätzlichen Spalte der Bestelltabelle speichern könnte). Möglicherweise muss ich die Dateien in Unterordnern speichern, einen pro Monat, und den Unterordnernamen in der Bestellzeile in der Datenbank speichern, um zu verhindern, dass zu viele tausend Dateien in einem Ordner gespeichert werden.

Nachdem die PDF-Dateien gespeichert sind, können sie nach Eingabe der entsprechenden Bestellnummer über den Browser heruntergeladen und angesehen werden.

Ich tendiere zur Option (1), weil mir die Datenverwaltung einfacher erscheint, wenn alle relevanten Daten in einer Datenbank sind. Aber ich habe ein wenig Angst, dass ich im Laufe der Zeit auf Leistungsprobleme stoßen könnte, da die Datenbankgröße viel schneller wachsen wird als bei Lösung (2). Etwa 90% oder sogar 95% der Gesamtgröße der Datenbank würden nur aus diesen gespeicherten PDF-Dateien bestehen.

Hier sind einige zusätzliche Informationen:

  • Die PDF-Dateien haben jeweils eine Größe von ca. 100 Kilobyte
  • Etwa 1500 Bestellungen/PDF-Dateien pro Monat
  • Windows Server 2008 R2 / IIS 7.5
  • SQL Server 2008 SP1 Express
  • Nicht ganz sicher über die Hardware, ich glaube an einen QuadCore-Prozessor und 4 GB RAM
  • Die Anwendung ist in ASP.NET Webforms 3.5 SP1 geschrieben

(Mir ist bewusst, dass ich mit den oben genannten Zahlen nach ca. 2 Jahren das 4-GB-Limit der SQL Server Express-Edition erreichen werde. Aber das können wir hier außer Acht lassen, entweder das Löschen alter Daten aus der Datenbank oder ein Upgrade auf eine Vollversion wären eine mögliche Option.)

Meine Frage ist: Was sind die Vor- und Nachteile der Optionen und was würden Sie empfehlen? Vielleicht hatte jemand eine ähnliche Aufgabe und kann über seine Erfahrungen berichten.

Vielen Dank im Voraus für die Antwort!

Verwandt:

Bilder in der Datenbank speichern - Ja oder Nein?

27voto

marc_s Punkte 701497

Mit SQL Server 2008 wird bei Dokumenten, die hauptsächlich 1 MB oder mehr groß sind, die FILESTREAM-Funktion empfohlen. Dies basiert auf einem von Microsoft Research veröffentlichten Papier mit dem Titel To BLOB or not to BLOB, das die Vor- und Nachteile der Speicherung von Blobs in einer Datenbank ausführlich analysierte - sehr lesenswert!

Für Dokumente mit einer Größe von weniger als durchschnittlich 256K scheint die Speicherung in einer VARBINARY(MAX)-Spalte am besten zu passen.

Alles dazwischen ist wirklich eine Entscheidungssache.

Sie sagen, dass Sie hauptsächlich PDF-Dokumente von etwa 100K oder so haben -> diese können sehr gut in einer SQL Server-Tabelle gespeichert werden, kein Problem. Eine Sache, die Sie in Betracht ziehen könnten, ist die Einrichtung einer separaten Tabelle für die Dokumente, die mit der Hauptfaktentabelle verknüpft ist. Auf diese Weise wird die Faktentabelle schneller nutzbar sein, und die Dokumente kommen Ihrem anderen Daten nicht in die Quere.

2voto

Oded Punkte 475566

1voto

RichO Punkte 758

I would also create a separate table for the documents, that way the search data/key fields for document retrieval will be more cache'able. The only time your database will need to touch the document table is during an insert or download.

Translated to:

Ich würde auch eine separate Tabelle für die Dokumente erstellen, so dass die Suchdaten/Schlüsselfelder für die Dokumentenabfrage besser im Cache gespeichert werden können. Die einzige Zeit, in der Ihre Datenbank die Dokumenttabelle bearbeiten muss, ist bei einem Einfügen oder Herunterladen.

1voto

David Robbins Punkte 10000

Ich würde DAGEGEN empfehlen, die Dateien nicht in SQL zu speichern. Sie fügen überflüssige Überlastung hinzu, wenn Sie die Dateien abrufen. IIS ist sehr effizient beim Bereitstellen von Dateien, aber mit SQL als Speicherort haben Sie jetzt einen Flaschenhals eingeführt, da Sie nun von Ihrem Webserver zu Ihrem SQL-Server springen müssen, um die Datei zu erhalten.

Wenn Sie Ihre Dateien auf dem Webserver speichern, kann Ihr Prozess die entsprechende Datei basierend auf den von Ihnen aufgeführten Kriterien bestimmen, darauf verweisen und sie bereitstellen. Dokumentenverwaltungssysteme wie Documentum und Alfresco speichern die Dateien auf einem Freigabeordner, was Ihnen große Flexibilität in Bezug auf Backup und redundante Speicherung ermöglicht.

0voto

TonyP Punkte 5394

Ich bin skeptisch, große Blobs in SQL zu speichern, unter der Annahme, dass die Seitengröße von SQL 4k beträgt (aus dem Bauch heraus).. es muss Fragmente der gesamten Datei in nK-Blöcken zusammenstellen, wenn die Datei dem Benutzer zurückgegeben wird.. Ich bin mir nicht sicher, ob das der Fall ist oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X