[Php-avanzado] Hasta que punto conviene Normalizar una DB
Leonardo Tadei - Pegasus Tech Supply
leonardot en pegasusnet.com.ar
Lun Abr 25 17:23:22 ART 2011
Hola Gonzalo,
El lun, 25-04-2011 a las 13:32 -0300, Rama Gonzalo escribió:
> Sigo normalizando.. o desnormalizando ?..
normalizá, que a la larga, siempre es mejor.
> Tengo un table "video" otra "serie" y otra "temporada" .
> Un "video","serie" o "temporada" tienen uno o varios "títulos" (según el
> idioma) y una o varias "descripciones" (según el idioma), una "serie" es
> una colección de "temporadas" y una "temporada" es una coleccción de videos.
Bueno... una "colección" es otro concepto, y por el problema de
impedancia de paradigmas Relacional-OOP, no se pueden (literalmente!)
mezclar las cosas.
> hice esto:
> --tabla video--
> id
> pais_id
> idioma_id
> titulo_id (primaria)
> descripcion_id (primaria)
> serie_id
> temporada_id (no es primaria)
No entiendo: si "tienen uno o varios "títulos" (según el idioma)" no
tiene sentido que acá esté el idioma... ni el título.
Idem para los demás...
> ---serie---
> id
> pais_id
> idioma_id
> titulo_id (primaria)
> descripcion_id (primaria)
>
> ---temporada-
> id
> titulo_id (primaria)
> descripcion_id (primaria)
> serie_id
>
> ---titulo----
> id (no es clave primaria) se repite tantas veces como títulos tenga un
> mismo video
> texto
> idioma_id
Horrible! Hacé que, además del id para la relación, tenga un id único
primario. Si no podés acceder unívocamente a un registro, estás frito!
Idem para la siguiente.
> ---descripcion ---
> id (no es clave primaria) se repite tantas veces como descripciones
> tenga un video
> texto
> idioma_id
> oiginal (buleano que indica si es el titulo orignal del video)
>
> De esta forma.., a partir de una serie acceso a todos los videos de y
> temporadas de la misma e inversamiente, desde un video puedo acceder a
> toda la serie y temporadas de la serie, de la que es parte el video.
Esta característica se dará siempre que tengas normalizados los datos,
y puede no darse si no está normalizado.
> No me gusta el diseño, pero "creo" que evitar varias tablas y por ende
> muchos JOIN.. y gano algo rendimiento (suponiendo que es un DB con alto
> tráfico).
No es cierto: las DB están preparadas para responder rápidamente sobre
una estructura normalizada. Tiene más penalización de rendimiento que no
normalices.
> -----------------Otra podría ser:
>
> ---video---
> id
> pais_id
> idioma_id
> titulo_original_id (primaria)
>
> --- serie
> id
> pais_id
> idioma_id
> titulo_original_id (primaria)
>
> ---temporada
> id (primaria)
> serie_id
>
> -----titulo
> id (primaria)
> text
> idioma_id
>
> ----descripcion
> id (primaria)
> text
> idioma_id
>
>
> ---rel_video_titulo
> video_id
> titulo_id
> --rel_video_descripcion
> video_id
> descripcion_id
>
> ---rel_serie_titulo (similar video)
> ---rel_serie_decripción (similar video)
> ---rel_tempora_titulo (similar video)
> ---rel_temporada_descripcon (similar video)
>
> De esta forma tendría todo más normalizado, con unas 6 tablas más. Pero
> ¿bajaría mucho el rendimiento ?
No.
El rendimiento será bueno o no dependiendo de si tenés buenos índices o
no, y casi de nada más.
> Se podrían "quizá" fusionar las tablas titulo y descripción ,
> y reducir la cantidad de relaciones.
Por el problema que describís, tiene sentido que el título y la
descripción para un idioma estén en una sola tabla, porque la
normalización dice que ambos dependen de la misma clave primaria.
Dos cosas: la cantidad de relaciones es irrelevante.
La normalización no es opinable: se aplica el método y nada más. Vos
estás planteando las cosas al revés... deberías primero normalizar en
3FN, y sobre el conjunto de tablas y campos que surjan, ver si podés y
vale la pena "ahorrarse" algo.
> Muchas gracias! nuevamente.
por nada...
PD: y la tabla de usuarios? ;-)
--
Leonardo Tadei
leonardot en pegasusnet.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
Más información sobre la lista de distribución Php-avanzado