Skip site navigation (1) Skip section navigation (2)

Re: RE: [pgsql-es-ayuda] Optimización de Nomencladores

From: "usuario anonimo" <opinante(dot)anonimo(at)gmail(dot)com>
To: "Alvaro Herrera" <alvherre(at)commandprompt(dot)com>
Cc: Rafael Yordanis Rodríguez Montero <rafael(at)uci(dot)cu>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: RE: [pgsql-es-ayuda] Optimización de Nomencladores
Date: 2007-09-22 03:07:15
Message-ID: 91b524660709212007s13d6eebdo74d2c134383403a@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
El 21/09/07, Alvaro Herrera <alvherre(at)commandprompt(dot)com> escribió:
> Rafael Yordanis Rodríguez Montero escribió:
> > OK, yo pensé que todos le llamaban nomenclador, me explico:
> > Para mi un nomenclador es una tabla auxiliar, por ejemplo:
> > Tengo las siguientes tablas:
> > Persona                       Color
> > --------                       ------
> > idPersona                    idColor
> > Nombre                      Nombre
> > Edad
> > idColor
>
> > La tabla Color es el nomenclador, espero me hayan comprendido, cuál es
> > el nombre correcto de esto?, les agradecería de todo corazón, pero lo
> > que me hace más falta es si me pudieran dar una pista  para resolver
> > mi problema, imaginen que mi tabla persona tiene asociado 70 tablas de
> > este tipo, ejemplo: color de la piel, color de los ojos, tipo de boca,
> > tipo de cejas, etc, se almacenan tantos datos porque es una base de
> > datos policial y ellos son muy exquisitos con esto, ahora, yo imagino
> > que cuando yo tenga algunas millones de personas almacenadas, una
> > consulta para tomar todo lo de persona, se ponga muy pesada, lo que
> > quisiera es que me den una pista de como eliminar estos nomencladores.
>
> Ah.  Hay varias formas de modelar esto:
>
> 1. con tablas auxiliares, como lo estas haciendo actualmente.  En rigor
> esto no deberia ser un gran problema, pero quizas al llegar a un join de
> 70 tablas podria serlo.
>
> 2. Usar el valor en la tabla principal, por ej. color de ojos y escribir
> "azul" en cada registro.  La gracia con respecto a (1) es que te ahorras
> un join, pero el problema es que tienes el valor repetido muchas veces,
> y ademas en terminos absolutos la BD sera mas pesada porque repetir cada
> string es mucho mas pesado que poner un ID numerico en cada una.
>
> 3. Usar un enum, y convertir a un valor "real" en el codigo de la
> aplicacion.  Por ej. usar el tipo "char" (incluyendo comillas), que
> ocupa un byte, y en ese byte codificar los valores posibles.  Esto se
> usa en los catalogs del sistema, por ejemplo en pg_class.relkind que
> tiene valores posibles 'r', 'i', 't', 's', etc.  Cada valor tiene un
> significado que debes asociarle separadamente (en el codigo); puedes
> usar un CHECK para asegurarte que no se ingresan valores no validos.
>
> 4. en Postgres 8.3 hay un nuevo tipo de datos, ENUM, que parece ser
> ideal para lo que quieres.  De hecho yo diria que de todas las
> soluciones que te propongo, esto es lo mas recomendable.
> Lamentablemente no esta disponible aun en una version liberada, pero si
> puedes darte el lujo de esperar un poco, es una alternativa a
> considerar.

Yo solucionaría esto de la siguiente forma:

Creo cuatro tablas delincuente,atributos,valores y caracteristicas
donde la tabla "caracteristicas" con tiene registros de intersección,
osea una clave foranea por cada una de las otras tres tablas, algo
asi:

create table caracteristicas(
        id_delincuente bigint REFERENCES delincuente(id),
        id_atributo bigint REFERENCES atributos(id),
        id_valor bigint REFERENCES valores(id),
        UNIQUE (id_delincuente,id_atributo)
);

En la tabla delincuentes tengo nombre, edad, sexo del personaje y en
atributos los características que deseo guardar y conocer del
delincuente y en la tabla "valores"  los valores posibles de estas
características.

El problema de mi solución es que por ejemplo si quieres guardar el
numero de dedos de un delincuente tendrás que hacerlo en un campo
varchar y que por ejemplo en la tabla valores se repetirán valores
pero para distintos atributos como por ejemplo, tipo de boca que puede
ser chica y tipo de cejas que también puede ser chica. aun que creo
que podemos mejorar esta solución es la que mas me gusta :-)

adjunto mi script de pruebas.

ps:esta tipo de solución la vi en oscommerce pero para productos...


>
> --
> Alvaro Herrera                 http://www.amazon.com/gp/registry/CTMLCN8V17R4
> "Nunca confiaré en un traidor.  Ni siquiera si el traidor lo he creado yo"
> (Barón Vladimir Harkonnen)
> --
> TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net
>


-- 
_________________________________
Solo soy una mente genial en un cuerpo

Attachment: ficha.sql
Description: text/x-sql (2.0 KB)

In response to

Responses

pgsql-es-ayuda by date

Next:From: Gabriel Hermes Colina ZambraDate: 2007-09-22 03:42:07
Subject: Re: RV: URGENTE
Previous:From: Ernesto QuiñonesDate: 2007-09-22 02:01:24
Subject: Re: RE: [pgsql-es-ayuda] Optimización de Nomencladores

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group