Normalización en base de datos 🧷

Lo mínimo que debes de saber para diseñar tu base de datos con un súper rendimiento 🦸‍♂️

23.10.2022 a las 18:09

Normalización en base de datos 🧷

⚫ Las 5 reglas al diseñar una base de datos SQL

⚫ Primera Forma Normal (1FN)

🟣 Atomicidad

🟣 Índice o clave (primary key)

🟣 Número de campos fijos

⚫ Segunda Forma Normal (2FN)

⚫ Tercera Forma Normal (3FN)

⚫ Resumen

Normalización en base de datos 🧷

Si eres desarrollador, tarde o temprano te vas a tener que enfrentar a diseñar una base de datos SQL.


Te explico lo mínimo que tendrías que tener en cuenta para diseñar una base de datos SQL con buen rendimiento.


En este artículo te explicaré lo que a mí me hubiera gustado que me contaran cuando diseñé mi primera base de datos SQL 🤝

Las 5 reglas al diseñar una base de datos SQL

La normalización básicamente es un conjunto de reglas para diseñar una base de datos SQL a las que se conocen como formas y que entre otras cosas buscan evitar la redundancia de datos.


Mi recomendación es que normalices tu base de datos hasta la tercera forma o regla.


Hasta la fecha me he enfrentado a multitud de bases de datos de distintos motores con muchísimos datos (más de 300 datos por minuto) y no he tenido la necesidad de ir más allá.


Por el motivo anterior explicaré sólo las 3 primeras reglas o formas.

Primera Forma Normal (1FN)

Me apoyaré en la siguiente tabla, que es un listado de portátiles, para explicar las reglas o formas.

NombrePaísSSD 512GBHDD 2TB
PORTATIL HP 15S-FQ4038NSUSA10
PORTATIL HP 15S-FQ4038NSUSA01
GAMING ASUS GA401QC-HZ018CHINA10
PORTATIL HP 15s-fq2155nsUSA01
ASUS CHROME CX1500CNA-EJ0101CHINA01

La primera forma nos habla de:

Atomicidad

Si hacemos la suposición de que el átomo es indivisible es a ésto a lo que se refiere. Tienes que dividir la información en campos hasta dicha información no se pueda dividir más.


Si aplicamos la regla de atomicidad nos fijamos que podemos separar la información de la tabla original, por ejemplo, sacando del nombre el fabricante y añadiéndolo como un nuevo campo.

NombreFabricantePaísSSD 512GBHDD 2TB
PORTATIL15S-FQ4038NSUSAHP10
PORTATIL15S-FQ4038NSUSAHP01
GAMING GA401QC-HZ018CHINAASUS10
PORTATIL HP 15s-fq2155nsUSAHP01
CHROME CX1500CNA-EJ0101CHINAASUS01

Índice o clave (primary key)

El índice, campo clave o primary key será un campo único para cada item o fila de la tabla.


Este campo nos permitirá realizar búsquedas muy rápidas.


No tiene por qué ser una sola columna, pueden ser varias columnas las que formen el índice. Lo que siempre se tiene que respetar es que sea único para cada fila.


Para este índice es muy común usar un campo auto incrementable, de forma que el motor de la base de datos se encarga de ir completando al añadir una nueva fila.

Número de campos fijos

Tienes que buscar que el número de campos o columnas sea fijo.

Imagina que en la tabla original nos entra un portátil igual pero con un disco duro SSD de 1T, ello nos obligaría a añadir una nueva columna o campo en nuestra tabla.


Esto no es correcto, lo correcto sería crear una nueva tabla con los distintos discos duros que pueda tener el portátil y referenciarla con su índice a nuestra tabla original, así 👇

TipoDiscoDuro
Id
1SSD 512GB
2HDD 2TB

De esta forma, cuando aparezca un portátil con un disco duro diferente a los que tenemos en la base de datos será suficiente con añadirlo a la tabla de TiposDiscoDuro


Ahora referenciamos la nueva tabla con la tabla original.

NombreFabricanteIdTipoDiscoDuro
PORTATIL15S-FQ4038NSHP1
PORTATIL15S-FQ4038NSHP2
GAMING GA401QC-HZ018ASUS1
IP 3 15ALC6HP2
CHROME CX1500CNA-EJ0101ASUS2

⚫ Segunda Forma Normal (2FN)

La segunda regla o forma nos dice muy resumidamente que evitemos la duplicidad de datos.


Si te fijas, en la tabla estamos viendo datos repetidos, como el fabricante y el nombre, te los coloreo para que te des cuenta 🧐

NombrePaísFabricanteIdTipoDiscoDuro
PORTATIL15S-FQ4038NSUSAHP1
PORTATIL15S-FQ4038NSUSAHP2
GAMING GA401QC-HZ018CHINAASUS1
PORTATIL HP 15s-fq2155nsUSAHP2
CHROME CX1500CNA-EJ0101CHINAASUS2

¿Cómo hacemos para evitar los datos duplicados? Fácil, creamos una nueva tabla para el fabricante (que tendrá asociado el país) y otra para el nombre del portátil

Fabricante
IdFabricanteNombrePaís
1HPUSA
2ASUSCHINA
Portátil
IdNombreIdFabricante
1PORTATIL15S-FQ4038NS1
2GAMING GA401QC-HZ0182
3IP 3 15ALC63
4CHROME CX1500CNA-EJ01012

Nuestra base de datos iría quedando así 👇

PortátilTipoDiscoDuro
IdIdPortatilIdTipoDiscoDuro
111
212
321
432
542

⚫ Tercera Forma Normal (3FN)

La tercera regla o forma nos dice básicamente que eliminemos los campos que no dependen del índice o clave.


Aquí tenemos que ir a la tabla de Fabricante y fijarnos...

Fabricante
IdFabricanteNombrePaís
1HPUSA
2ASUSCHINA

Con los datos que estamos manejando, no se le ve mucho sentido a sacar una tabla para los países, pero... qué ocurre si queremos meter muchos más portátiles de otras marcas con los mimos países que ya están, por ejemplo LENOVO (CHINA)...


En este caso se nos comenzarán a repetir los países y es posible que queramos en un futuro hacer una búsqueda por países.


Así que creo una nueva tabla de países

País
IdPaisNombre
1USA
2CHINA

La tabla de Fabricante quedaría:

Fabricante
IdFabricanteNombreIdPais
1HP1
2ASUS2

Resumen

Resumiendo, hemos pasado de la base de datos (tabla) original

NombrePaísSSD 512GBHDD 2TB
PORTATIL HP 15S-FQ4038NSUSA10
PORTATIL HP 15S-FQ4038NSUSA01
GAMING ASUS GA401QC-HZ018CHINA10
PORTATIL HP 15s-fq2155nsUSA01
ASUS CHROME CX1500CNA-EJ0101CHINA01

A una base de datos normalizada a la tercera forma

País
IdPaisNombre
1USA
2CHINA
Fabricante
IdFabricanteNombreIdPais
1HP1
2ASUS2
Portátil
IdNombreIdFabricante
1PORTATIL15S-FQ4038NS1
2GAMING GA401QC-HZ0182
3IP 3 15ALC63
4CHROME CX1500CNA-EJ01012
TipoDiscoDuro
Id
1SSD 512GB
2HDD 2TB
PortátilTipoDiscoDuro
IdIdPortatilIdTipoDiscoDuro
111
212
321
432
542

Hasta luego 🖖

Servicios

Software

IoT

Digitalización

Aplicaciones móviles

Consultoría

fjmduran.com v0.1.2