
Partición vertical de Tablas
En el artículo de Tablas particionadas se describió la forma de como particionar una tabla de manera horizontal, cuando se proyecta que esta tabla va a tener muchos registros.
En este artículo se explica como se particiona una tabla de manera vertical, esto es básicamente dividiendo la cantidad de campos que tiene la tabla en varias tablas y ubicarlas en diferentes grupos de archivos.
Con regularidad se usa para separar los campos que ocupan mucho espacio como los de tipo Image para ubicarlos en otra tabla relacionadas con claves foráneas.
Pasos para crear una tabla particionada verticalmente
1. Crear una base de datos que tenga varios grupos de archivos. (Ver Crear Bases de datos)
Las carpetas serán C:\DataBD y D:\ImagenesBD
xp_create_subdir ‘C:\DataBD’
go
xp_create_subdir ‘D:\ImagenesBD’
go
Create database ParticionVertical
on Primary (name=Data01, Filename= ‘C:\DataBD\Data01.mdf’),
filegroup VENTAS (name=Data02, Filename= ‘C:\DataBD\Data02.ndf’),
filegroup CUENTAS (name=Data03, Filename= ‘D:\ImagenesBD\Data03.ndf’),
filegroup RECURSOS (name=Data04, Filename= ‘D:\ImagenesBD\Data04.ndf’)
LOG ON
(name=DataLog01, Filename= ‘D:\ImagenesBD\DataLog01.ldf’)
go
2. Crear la tabla, crearemos para el ejemplo una tabla de productos, los datos de los productos en una tabla en el grupo VENTAS y las imágenes de los mismos en el grupo RECURSOS. (Ver Crear tablas)
use ParticionVertical
go
La tabla productos no contiene la imagen de estos.
Create table Productos (
ProductosCodigo nchar(8),
ProductosDescripcion nvarchar(50) not null,
ProductosPrecio numeric(9,2),
ProductosStock numeric(9,2),
ProductosEstado nchar(1),
constraint ProductosPK primary key (ProductosCodigo),
constraint ProductosPrecioCK check (ProductosPrecio>=0)
) on VENTAS
go
3. La tabla ProductosImagen contiene la foto de cada producto, en una tabla separada en otro grupo de archivos.
Create table ProductosImagen (
ProductosImagenCodigo nchar(8),
ProductosImagenFoto Image,
constraint ProductosImagenPK primary key (ProductosImagenCodigo),
constraint ProductosImagenProductosFK Foreign key (ProductosImagenCodigo)
references Productos(ProductosCodigo)
) on RECURSOS
go
Importante:
Para conseguir que los datos de la tabla Productos se particione es necesario crear las tablas anteriores en diferentes grupos de archivos. Para nuestro ejemplo se creó la tabla Productos en el grupo de archivos VENTAS y la tabla ProductosImagen en el grupo de archivos RECURSOS.
4. Insertar registros
El producto sin la foto en Productos, y luego la foto en ProductosImagen. (Ver Insertar imágenes desde SQL Server)
Teclado
insert into Productos values (‘T0467′,’Teclado’,45,10,’A’)
go
insert into ProductosImagen
select ‘T0467’ As ProductosImagenCodigo, *
from OpenRowset(Bulk ‘D:\Imagenes\Teclado.jpg’, Single_Blob) As Picture
go
Mouse
insert into Productos values (‘T9867′,’Mouse’,185,30,’A’)
go
insert into ProductosImagen
select ‘T9867’ As ProductosImagenCodigo, *
from OpenRowset(Bulk ‘D:\Imagenes\Mouse.jpg’, Single_Blob) As Picture
go
Monitor
insert into Productos values (‘T0970′,’Monitor’,385,12,’A’)
go
insert into ProductosImagen
select ‘T0970’ As ProductosImagenCodigo, *
from OpenRowset(Bulk ‘D:\Imagenes\Monitor.jpg’, Single_Blob) As Picture
go
Si se listar los registros de ambas tablas
select * from Productos
select * from ProductosImagen
go
Se puede ver los datos de los productos en la tabla Productos y sus imágenes en la tabla ProductosImagen

5. Para ver los datos se creará una vista (Ver Vistas)
Create view vistaProductos
As
Select P.ProductosCodigo, P.ProductosDescripcion,
P.ProductosPrecio,P.ProductosStock, P.ProductosEstado,
I.ProductosImagenFoto
from Productos As P
join ProductosImagen As I on P.ProductosCodigo = I.ProductosImagenCodigo
go
Para listar los Productos y las imágenes de los mismos se utilizará la vista
select * from vistaProductos
go

Recomendación
Cuando cree su procedimiento almacenado que guarda el registro en la tabla Productos, debe incluir la instrucción para insertar el mismo registro en la tabla ProductosImagen. Se puede usar Trigger. (Ver Triggers)