Publicado el 23.10.2022 a las 16:09
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 🤝
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.
Me apoyaré en la siguiente tabla, que es un listado de portátiles, para explicar las reglas o formas.
Nombre | País | SSD 512GB | HDD 2TB |
---|---|---|---|
PORTATIL HP 15S-FQ4038NS | USA | 1 | 0 |
PORTATIL HP 15S-FQ4038NS | USA | 0 | 1 |
GAMING ASUS GA401QC-HZ018 | CHINA | 1 | 0 |
PORTATIL HP 15s-fq2155ns | USA | 0 | 1 |
ASUS CHROME CX1500CNA-EJ0101 | CHINA | 0 | 1 |
La primera forma nos habla de:
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.
Nombre | Fabricante | País | SSD 512GB | HDD 2TB |
---|---|---|---|---|
PORTATIL15S-FQ4038NS | USA | HP | 1 | 0 |
PORTATIL15S-FQ4038NS | USA | HP | 0 | 1 |
GAMING GA401QC-HZ018 | CHINA | ASUS | 1 | 0 |
PORTATIL HP 15s-fq2155ns | USA | HP | 0 | 1 |
CHROME CX1500CNA-EJ0101 | CHINA | ASUS | 0 | 1 |
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.
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 | |
1 | SSD 512GB |
2 | HDD 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.
Nombre | Fabricante | IdTipoDiscoDuro |
---|---|---|
PORTATIL15S-FQ4038NS | HP | 1 |
PORTATIL15S-FQ4038NS | HP | 2 |
GAMING GA401QC-HZ018 | ASUS | 1 |
IP 3 15ALC6 | HP | 2 |
CHROME CX1500CNA-EJ0101 | ASUS | 2 |
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 🧐
Nombre | País | Fabricante | IdTipoDiscoDuro |
---|---|---|---|
PORTATIL15S-FQ4038NS | USA | HP | 1 |
PORTATIL15S-FQ4038NS | USA | HP | 2 |
GAMING GA401QC-HZ018 | CHINA | ASUS | 1 |
PORTATIL HP 15s-fq2155ns | USA | HP | 2 |
CHROME CX1500CNA-EJ0101 | CHINA | ASUS | 2 |
¿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 | ||
---|---|---|
IdFabricante | Nombre | País |
1 | HP | USA |
2 | ASUS | CHINA |
Portátil | ||
---|---|---|
Id | Nombre | IdFabricante |
1 | PORTATIL15S-FQ4038NS | 1 |
2 | GAMING GA401QC-HZ018 | 2 |
3 | IP 3 15ALC6 | 3 |
4 | CHROME CX1500CNA-EJ0101 | 2 |
Nuestra base de datos iría quedando así 👇
PortátilTipoDiscoDuro | ||
---|---|---|
Id | IdPortatil | IdTipoDiscoDuro |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 3 | 2 |
5 | 4 | 2 |
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 | ||
---|---|---|
IdFabricante | Nombre | País |
1 | HP | USA |
2 | ASUS | CHINA |
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 | |
---|---|
IdPais | Nombre |
1 | USA |
2 | CHINA |
La tabla de Fabricante quedaría:
Fabricante | ||
---|---|---|
IdFabricante | Nombre | IdPais |
1 | HP | 1 |
2 | ASUS | 2 |
Resumiendo, hemos pasado de la base de datos (tabla) original
Nombre | País | SSD 512GB | HDD 2TB |
---|---|---|---|
PORTATIL HP 15S-FQ4038NS | USA | 1 | 0 |
PORTATIL HP 15S-FQ4038NS | USA | 0 | 1 |
GAMING ASUS GA401QC-HZ018 | CHINA | 1 | 0 |
PORTATIL HP 15s-fq2155ns | USA | 0 | 1 |
ASUS CHROME CX1500CNA-EJ0101 | CHINA | 0 | 1 |
A una base de datos normalizada a la tercera forma
País | |
---|---|
IdPais | Nombre |
1 | USA |
2 | CHINA |
Fabricante | ||
---|---|---|
IdFabricante | Nombre | IdPais |
1 | HP | 1 |
2 | ASUS | 2 |
Portátil | ||
---|---|---|
Id | Nombre | IdFabricante |
1 | PORTATIL15S-FQ4038NS | 1 |
2 | GAMING GA401QC-HZ018 | 2 |
3 | IP 3 15ALC6 | 3 |
4 | CHROME CX1500CNA-EJ0101 | 2 |
TipoDiscoDuro | |
---|---|
Id | |
1 | SSD 512GB |
2 | HDD 2TB |
PortátilTipoDiscoDuro | ||
---|---|---|
Id | IdPortatil | IdTipoDiscoDuro |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 3 | 2 |
5 | 4 | 2 |
Hasta luego 🖖