web-dev-qa-db-fra.com

Stocker PDF fichiers en tant qu'objets binaires dans SQL Server, oui ou non?

Je dois trouver une décision de conception pour la tâche suivante:

J'ai une base de données SQL Server et elle contient une table de commandes. PDF les documents seront téléchargés par les utilisateurs au moyen d'un simple téléchargement de fichier à partir d'une page Web et attribués à une commande. Il n'y a pas plus d'un document par commande (peut-être pas de document, jamais plus d'un). À cette fin, un utilisateur ouvre une page Web, saisit un numéro de commande, obtient la commande affichée et clique sur un bouton de téléchargement. Je sais donc à quel ordre appartient le document téléchargé.

J'envisage maintenant deux options pour stocker les documents sur le serveur Web:

1) Étendez ma table des commandes avec une colonne varbinary (MAX) et stockez le document PDF directement dans ce champ binaire.

2) Enregistrez le fichier PDF dans un dossier spécifique sur le disque et attribuez-lui un nom unique en rapport avec la commande (par exemple, mon numéro de commande qui est une clé primaire dans la base de données ou un GUID que je pourrais stocker dans une colonne supplémentaire du tableau des commandes). Je dois peut-être stocker les fichiers dans des sous-dossiers, un par mois, et stocker le nom du sous-dossier dans la ligne d'ordre de la base de données, pour éviter de placer trop de milliers de fichiers dans un seul dossier.

Une fois les fichiers PDF enregistrés, ils peuvent être téléchargés et visualisés via un navigateur après avoir entré le numéro de commande correspondant.

Je suis plutôt orienté vers l'option (1), car la gestion des données me semble plus facile si toutes les données pertinentes sont stockées dans une base de données. Mais je crains un peu de pouvoir rencontrer des problèmes de performances avec le temps car la taille de ma base de données augmentera beaucoup plus rapidement qu'avec solution (2). Environ 90%, voire 95%, de la taille totale de la base de données seraient constitués uniquement par les fichiers PDF enregistrés.

Voici quelques informations supplémentaires:

  • Les fichiers PDF auront une taille d'environ 100 kilo-octets chacun.
  • Environ 1500 commandes/fichiers PDF par mois
  • Windows Server 2008 R2/IIS 7.5
  • SQL Server 2008 SP1 Express
  • Pas tout à fait sûr du matériel, je crois un QuadCore Proc. et 4 Go de RAM
  • L'application est écrite dans ASP.NET Webforms 3.5 SP1

(Je suis conscient que j'atteindrai la limite de 4 Go de l'édition SQL Server Express après environ 2 ans avec les chiffres ci-dessus. Mais nous pouvons ignorer cela ici, soit supprimer les anciennes données de la base de données ou mettre à niveau vers une licence complète sera un option possible.)

Ma question est la suivante: quels sont les avantages et les inconvénients des options et que recommanderiez-vous? Peut-être que quelqu'un a eu une tâche similaire et peut raconter son expérience.

Merci d'avance pour la réponse!

En relation:

Stockage d'images dans la base de données - oui ou non?

18
Slauma

Avec SQL Server 2008, lorsque vous avez des documents dont la taille est généralement supérieure ou égale à 1 Mo, la fonctionnalité FILESTREAM est recommandée. Ceci est basé sur un article publié par Microsoft Research et intitulé To BLOB or not to BLOB qui analysait les avantages et les inconvénients du stockage de blobs dans une base de données très longue - bonne lecture!

Pour les documents de moins de 256 Ko en moyenne, leur stockage dans une colonne VARBINARY(MAX) semble être le meilleur choix.

Quelque chose entre les deux est un peu un coup de théâtre, vraiment.

Vous dites que vous aurez PDF documents principalement autour de 100 Ko environ -> ceux-ci seront très bien stockés dans une table SQL Server, sans problème. Vous voudrez peut-être envisager de créer un tableau séparé pour les documents, lié au tableau des faits principaux. De cette façon, l'utilisation de la table de faits sera plus rapide et les documents ne gêneront pas vos autres données.

22
marc_s
2
Oded

Je créerais également une table distincte pour les documents. Ainsi, les champs de données/clés de recherche pour la récupération des documents seront plus faciles à mettre en cache. Le seul moment où votre base de données devra toucher la table des documents est lors d'une insertion ou d'un téléchargement.

1
RichO

Je recommanderais AGAINST de stocker les fichiers en SQL. Vous ajoutez une surcharge supplémentaire lors de la récupération des fichiers. IIS est très efficace pour la gestion de fichiers, mais avec SQL, vous avez maintenant introduit un goulot d'étranglement, car vous devez maintenant passer de votre serveur Web à votre serveur SQL et revenir pour récupérer le fichier. . 

Lorsque vous stockez vos fichiers sur le serveur Web, votre processus peut déterminer le fichier approprié en fonction des critères que vous avez énumérés, pointer dessus et le servir. Les systèmes de gestion de documents tels que Documentum et Alfresco stockent les fichiers sur un partage, ce qui vous permet une grande flexibilité en matière de sauvegarde et de stockage redondant. 

1
David Robbins

Nous nous sommes retrouvés dans une situation similaire, mais en principe seulement. Nous avions besoin d'un moyen permettant d'accéder aux documents stockés sur SharePoint via un lien sur une page Web. Étant donné que tout est basé sur un projet avec un numéro de projet unique, la solution consistait à appliquer une convention de dénomination commune aux documents. s la page Web est créée côté serveur, les liens sont créés dynamiquement. Le code prend le chemin d'accès de base au serveur SharePoint, puis ajoute le numéro de projet et les spécificités du document. 

Exemple:

[SharePoint Base Path][Project Numbe][Project Document Name]
[http://mysharepoint.mycompany.com/213990/213990_PC.pdf]
0
user2063127

Je suis sceptique quant au stockage de gros blobs en SQL, en supposant que la taille d'une page SQL soit de 4 ko (en dehors de l'écrou) .. elle doit assembler un fragment du fichier entier en blocs nK lors de la restitution du fichier à l'utilisateur .. Je ne sais pas si cela est le cas ou pas.

0
TonyP