RE: [pgsql-es-ayuda] Optimización deNomencladores

From: Rafael Yordanis Rodríguez Montero <rafael(at)uci(dot)cu>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: [pgsql-es-ayuda] Optimización deNomencladores
Date: 2007-09-22 13:22:52
Message-ID: 251EA6C55832BE4C80F868CC951BA8CE043BA5A7@ucixw2.uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Muchas gracias a todos por sus respuestas, de hecho me han servido de mucho y principalmente a ver que la solución que encontré no es descabellada, la misma se basa en algo que me decía un usuario anónimo, algo parecido a un EAV (entity attribute value), como lo menciona Alvaro... Pero reconozco que tiene el inconveniente, tal como Alvaro lo dice, que pierdo los tipos de datos de cada nomenclador o Clasificador, como quieran llamarle, pero bueno, creo que no es un gran inconveniente para mí ya que todo lo que manejo en ellos son datos de tipo varchar, aunque me interesaría mucho que lo que decía Alvaro del tipo de dato ENUM, parece interesante, pero no me puedo dar el lujo de esperar por él, pues estoy un poco retrazado en el cronograma de entrega de el proyecto.
Nuevamente muchas gracias por su colaboración.
De todo corazón desde Cuba
Rafael

________________________________

From: pgsql-es-ayuda-owner(at)postgresql(dot)org on behalf of Alvaro Herrera
Sent: Fri 21/09/2007 22:01
To: Rafael Yordanis Rodríguez Montero
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Optimización deNomencladores

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.

--
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

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message JOSE LUIS RODRIGUEZ 2007-09-22 20:52:20 Re: ayuda con query por favor
Previous Message David Acevedo Salazar 2007-09-22 11:48:37 Re: Identificar si hay bloqueos