Partición Vertical de Tablas en SQL Server

Partición vertical de Tablas

En el artículo de Tablas particionadas compartí 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 les comparto 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

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)