Está en la página 1de 3

22/2/2021 Categorización en la base de datos

Categorización en la base de DEC

datos (/2009/12/categorizacion-en- 13
2009
la-base-de-datos/)
No es un secreto de que siempre me ha gustado programar mis
propios CMS. Ok, estamos de acuerdo, este blog no es el mejor
(/)
ejemplo de ello, pero sitios como por ejemplo unreal4u.com
(http://unreal4u.com), mi tesis y muchos otros trabajos que he hecho
se han basado en este principio. SOBRE MI

Sin embargo, en algunas de esas pegas me he encontrado con la Camilo Sperberg es Ingeniero
sorpresa amarga de que muchas veces el diseño de la base de datos Informático especializado en
es horrible. Linux y PHP. Éste es su blog
oficial y aquí podrá leer mucha
Modelo antiguo más información acerca de
temáticas variadas en el bajo
El modelo antiguo sigue una tendencia bastante básica. Tanto así, que
mundillo de la informática
una vez que me hice cargo de un sistema más o menos grandote me
relacionada con esos tópicos
di cuenta que tenía 25 tablas extra con información del tipo:

id | nombre YO EN INTERNET
1 | primero
2 | segundo
Twitter
3 | tercero
(https://twitter.com/unreal4u)
capa9.net
Cabe destacar que este modelo lo encontré pésimo. Tenía que haber (http://www.capa9.net/)
alguna solución más fácil que sólo implicara una tabla donde pudiera GitHub
guardar descripciones cortas de todo tipo, así que me puse a pensar (https://github.com/unreal4u/)
en alguna solución que fuera un poco más definitiva. Google+
(https://plus.google.com/+CamiloSperberg/posts)
2009-11-24-u4u-0017 (http://blog.unreal4u.com/wp-
YouTube
content/gallery/base-de-datos-diseno/2009-11-24-u4u-
(https://www.youtube.com/user/unreal4u)
0017.png)Modelo clásico: una ensalada de tablas chicas
ZCE
Este modelo emplea el tipo de categorización de todas partes con (http://www.zend.com/en/yellow-
tablas muy chicas, todas separadas. pages/ZEND016746)

Ventajas de este modelo


QUOTES GENIALES
1. Fácil de programar. Si quiero hacer una consulta que me retorne
el nombre de usuario y el nombre del grupo al cual pertenece,
Because my reality... is just
basta con un simple join: [sql]SELECT a.login, b.descripcion
your virtuality
FROM alumnos AS a LEFT JOIN grupos AS b ON a.id_grupo =
— Camilo Sperberg
b.id_grupo;[/sql]

Desventajas de este modelo Debido a la gran cantidad


de guiños y referencias
1. Difícil de mantener. Si tengo 20 ó 30 tablas que tienen la misma
relacionadas con el mundo
declaración y quiero cambiar por ejemplo una falta ortográfica en
informático, esta sección
una de ellas o convertir todas las categorías a mayúsculas,
permanecerá siempre
significa que tendré que cambiar 20 ó 30 tablas. Además, se
incompleta, al menos hasta
podrán imaginar que si existen 30 tablas de categorizaciones, que se complete
eso significa que existirán muchas más tablas en el sistema.
— Futurama fan page

2. Velocidad. Aquí podrá haber muchísima discusión al respecto,


pero personalmente creo que una sola tabla bien optimizada es
Oh, i'm very confortable
más rápida que 30 tablas por separado que pueden no seguir un
with my sexuality, i just don't
mismo estándar entre todas. Aunque la gran mayoría de las
want to be slapped in the
tablas sólo es un índice con una breve descripción, donde la
face with THEIR sexuality
primera será una clave primaria, pueden haber casos donde; por
— Roy Trenneman en The IT
omisión del programador; esta regla general no se aplica y por lo Crowd S02E01
tanto, se estén perdiendo valuosos recuros.

En la próxima página, el modelo propuesto.


https://blog.unreal4u.com/2009/12/categorizacion-en-la-base-de-datos/ 1/3
22/2/2021 Categorización en la base de datos

Modelo propuesto POSTS MÁS


POPULARES
Hasta el momento sólo he hablado acerca del modelo antiguo… ¿pero
cuál es la propuesta super hiper maravillosa entonces? » Sobre collation y charset en
MySQL (/2012/08/sobre-
2009-12-12-u4u-0000 (http://blog.unreal4u.com/wp-
collation-y-charset-en-mysql/)
content/gallery/base-de-datos-diseno/2009-12-12-u4u-
» ¿Qué tengo que hacer para
0000.png)Modelo Propuesto: menos tablas, más fácil para la vista
sacar la certificación en PHP?
Este esquema nos presenta al menos a primera vista, algo bastante (/2012/08/que-tengo-que-hacer-
más simple que tener 20 a 30 tablas para distintas cosas: todo se para-sacar-la-certificacion-en-
reúne en una sola tabla, que en realidad es una subparte de otra. php/)
» Regiones, provincias y
Las ventajas de este modelo comunas de Chile en SQL
1. Mejor mantención. En vez de tener 20 ó 30 tablas con (/2011/03/regiones-provincias-y-
categorías, ahora sólo se mantiene una, lo cual cumple al 100% comunas-de-chile-en-sql/)
del propósito de una base de datos: juntar en un solo lugar de » INSERT a partir de un
manera optimizada mucha información. Por lo tanto, es posible SELECT, en una sola consulta
manejar esa información mediante un administrador de (/2011/02/insert-a-partir-de-un-
categorías, con la cual podrán agregar, quitar o editar categorías select-en-una-sola-consulta/)
de una forma más fácil que editando directamente la base de » ¿Problemas en los tildes o
datos realizando cambios. De todas formas, si por ejemplo, acentos? (/2010/09/problemas-
deseara convertir todas las descripciones de las categorías a en-los-tildes-o-acentos/)
mayúscula, basta una consulta para convertirlos todos, sin » Cómo ocupar ob_start(),
equivocarse o sin olvidarse de una tabla. ob_get_contents() y otros
relacionados (/2010/08/como-
2. Mejores índices (Estandarizados). Aunque en gran parte esta
ocupar-ob_start-
parte ya es cosa de cada uno, personalmente prefiero ocupar
ob_get_contents-y-otros-
tres índices:
relacionados/)
La primera para “acceso_directo”, que guarda la cadena » Sobre convenciones y
de 3 dígitos alfanuméricos cuya combinación es única. notaciones (húngara,
CamelCase, etc)
La segunda para la tabla categorias, que es la clave
(/2011/03/sobre-convenciones-y-
primaria de esa tabla. Esta clave primaria es la que se
notaciones-hungara-camelcase-
referenciará en las demás tablas, así que es como
etc/)
importante.
» Las razones de cambiarse de
La tercera, para la tabla categorías. Es una clave única SVN a Git (/2012/12/las-razones-
compuesta por “acceso_directo” y “descripción” que de-cambiarse-de-svn-a-git/)
opcionalmente se puede dejar como índice. (Sí: un índice » ¿Debería comprarme un Mac o
NO ES lo mismo que una clave única, la clave única sólo un PC? (/2012/03/deberia-
asegura que el o los registros a los cuales se les hace el comprarme-un-mac-o-pc/)
control no se vaya a repetir, pero no es implícitamente » phpDocumentor: Haciendo una
indexada a diferencia de una clave primaria, ese trabajo buena documentación excelente
nos queda a nosotros). De esa forma, nos aseguramos de (/2011/01/phpdocumentor-
que las descripciones no estén repetidas, pero sí se haciendo-una-buena-
puedan repetir en el caso que estén en distinta categoría. documentacion-excelente/)
En cuanto a este índice opcional, hay que verlo caso a caso porque
motores más potentes como PostGreSQL, que cumple 100% con
ACID, saca el índice desde la tabla a la cual es referenciada, por lo
que esta clave sería redundante, innecesaria e incluso puede
perjudicar el rendimiento de la base de datos en vez de acelerarla. De
todas formas se puede dejar sólo como una clave única, sin indexarla.

Las desventajas de este modelo


1. Consultas más complicadas. Aquí podrían haber dos casos: la
primera y la segunda ( :retard ). Fuera de bromas, la primera es
que desee rescatar la descripción asociada a una id y la
segunda es que desee rescatar todas las categorías de un cierto
tipo. (Por ejemplo, para elegir alguna opción de entre varios). De
esta manera, para cada ejemplo, las respectivas consultas:

https://blog.unreal4u.com/2009/12/categorizacion-en-la-base-de-datos/ 2/3
22/2/2021 Categorización en la base de datos

-- Primer caso: uniendo dos tablas


SELECT a.login, b.descripcion
FROM usuarios AS a LEFT JOIN categorias AS b ON a.id_grupo = b.id

-- Segundo caso: rescatando todas las categorías de un cierto tip


SELECT id_cat, descripcion FROM categorias
WHERE acceso_directo = 'etc'

Por último, un pequeño truco si deseara rescatar por ejemplo la


descripción de la id del curso Y la descripción del grupo:

SELECT a.login, b.descripcion, c.descripcion


FROM usuarios AS a, categorias AS b, categorias AS c
WHERE a.id_grupo = b.id_cat AND a.id_curso = c.id_cat

Conclusiones
El diseño de la base de datos es importante y uno siempre tiene que
pensar a lo grande. No sirve de nada pensar siempre en datos
limitados, con entradas limitadas y sin esperanza de que crezca: si el
sistema es bueno, va a crecer en algún punto. Es por esto que
prefiero para cualquier sistema, estandarizar las entradas y posibles
salidas que tenga el sistema, y una de ellas es acortando la pega a la
larga para el programador y además asegurando una consistencia en
los datos.

Puede que uno de estos días hable en mayor profundidad acerca de


eso. Pero por el momento, es lo que hay.

Saludos !!

TAMBIÉN EN BLOG.UNREAL4U.COM

hace 6 años • 1 comentario hace 5 años • 1 comentario hace 6 a


Explicando LVM parse error Ente
Semantic (y cómo imple
Versioning solucionarlo) …

Comentarios Comunidad 🔒 Políticas de Privacidad


1 Iniciar sesión

 Recomendar t Tweet f Compartir ordenar por el mejor

https://blog.unreal4u.com/2009/12/categorizacion-en-la-base-de-datos/ 3/3