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

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Rafael Yordanis Rodríguez Montero <rafael(at)uci(dot)cu>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: RE: [pgsql-es-ayuda] Optimización de Nomencladores
Date: 2007-09-22 02:01:04
Message-ID: 20070922020104.GA26030@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ernesto Quiñones 2007-09-22 02:01:24 Re: RE: [pgsql-es-ayuda] Optimización de Nomencladores
Previous Message Rafael Yordanis Rodríguez Montero 2007-09-22 01:31:46 RE: [pgsql-es-ayuda] Optimización de Nomencladores