Streaming de libros Parte 1 – Almacenamiento en FileStream

Voy a intentar ilustrar a lo largo de una serie de post la gestión de un almacén de libros. Para ello, vamos a utilizar la tecnología File Stream para su almacenamiento en nuestra base de datos Sql Server 2008 R2 Express, la tecnología Full-Text Search para su posterior indexación y consulta de contenidos y WCF + MTOM para hacer posible el streaming (tanto upload como downdload) de nuestros libros.

File Stream es una manera de guardar información no estructurada, como videos, imágenes, etc, fuera de nuestro almacenaje estructurado, por lo que esa información estarán directamente almacenada en el sistema de ficheros, eliminando las penalizaciones, tanto de rendimiento como de tamaño, que supondría tenerla directamente albergada en nuestras tablas. Otra ventaja de File Stream es que nos permite aprovechar mejor los límites de tamaño que las versiones Express nos ofrecen, ya que esta información almacenada en File Stream no se tiene en cuenta para esas restricciones :)

El primer paso que daremos es activar el soporte para File Stream en nuestro motor de base de datos, para ello abriremos el Sql Server Configuration Manager para acceder a las propiedades de nuestra instancia y ahí activar el soporter para File Stream:

image

image

Otra forma de activar el File Stream es en la instalación de nuestro Sql Server.

El siguiente paso es crear una base de datos con un filegroup File Stream para almacenar nuestros libros, después le indicaremos a la base de datos que ese va a ser el lugar seleccionado para tal propósito. Esta tarea podemos llevarla a cabo bien con el Sql Management Studio o bien a través de la ejecución de un script.

Utilizando el Sql Management Studio seguiríamos los siguientes pasos:

  • Creación de FileGroup de tipo File Stream, lo llamaremos BooksFileStream.

image

  • En la sección General, indicamos a la base de datos en qué File Group de tipo File Stream va a almacenar los libros y cuál va a ser su ruta física en el sistema de ficheros en la propiedad Path. La llamaremos Books_Data.

image

 

Si hubieramos optado por la ejecución de un script para la creación de nuestra base de datos, tendríamos que haber generado algo parecido a lo siguiente:

CREATE DATABASE [Books] ON  PRIMARY
( NAME = N'Books', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLR2EXPRESS64\MSSQL\DATA\Books.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [BooksFileStream] CONTAINS FILESTREAM  DEFAULT
( NAME = N'Books_data', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLR2EXPRESS64\MSSQL\DATA\Books_data' )
LOG ON
( NAME = N'Books_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLR2EXPRESS64\MSSQL\DATA\Books_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [Books] SET COMPATIBILITY_LEVEL = 100
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [Books].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

En el que, además de las tareas típicas de la creación de la base de datos, se crea el File Group de tipo File Stream y se indica la ruta para el almacenamiento. También se comprueba si la base de datos tiene soporte para Full Text Search activado, y en caso negativo, lo activa.

Y ya hemos creado nuestra base de datos con soporte de File Stream. Ahora crearemos la tabla Book, en la que almacenaremos nuestros libros, con su título, el tipo de fichero y su fichero propiamente dicho.

En esta tarea no tendremos opción de elegir entre realizarla con el Sql Server Management Studio o ejecutar un script, ya que no hay manera de indicar, a través del Sql Server Management Studio, que un campo de una base de datos es File Stream. El script sería el siguiente:

CREATE TABLE [dbo].[Book] (
    [IdBook]       UNIQUEIDENTIFIER           ROWGUIDCOL NOT NULL,
    [Title]        NVARCHAR (MAX)             NULL,
    [DocumentType] NVARCHAR (10)              NULL,
    [Data]         VARBINARY (MAX) FILESTREAM NULL DEFAULT(0x),
    UNIQUE NONCLUSTERED ([IdBook] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF) ON [PRIMARY]
);

Me gustaría aclarar que File Stream en sí no es un tipo, si no la manera en que ese campo de la base de datos va a almacenarse. El tipo en sí es varbinary(max).

Adelantandonos a capítulos posteriores, hay que decir que, para la posterior creación de un índice Full Text Search es necesario contar en la tabla con un campo único no nulo decorado con la propiedad ROWGUIDCOL, que indica que la nueva columna es una columna de GUID de filas. Además, será necesario la creación de una columna NVARCHAR o tipo similar que almacenará la extensión del fichero en que hayamos guardado el libro (.docx, .pdf, etc), esta última columna es necesaria porque los datos indexados están en una columna de tipo varbinary y el motor de indexación Full Text Search necesita conocer el tipo de fichero sobre el que va a operar.

En el siguiente post hablaremos de la generación del índice Full Text Search y cómo útilizarlo para nuestras consultas.

Comparte este post: