Re: Consulta sobre cómo armar estructura de tablas

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Damián Culotta <dculotta(at)fibertel(dot)com(dot)ar>
Cc: Ayuda PostgreSql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Consulta sobre cómo armar estructura de tablas
Date: 2006-02-08 12:05:25
Message-ID: 20060208120525.GA5219@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Damián Culotta escribió:

Hola,

> Buenas tardes lista.
> Tengo una duda sobre cómo armar una estructura de tablas.
> Estoy queriendo armar en la base, la lista de provincias, departamentos, municipios y localidades de Argentina.
> El problema surge en que no todas las provincias tienen la misma
> división administrativa. Ejemplifico los posibles casos de jerarquía:

Se me ocurren varias ideas.

Una es que cada nivel tenga relaciones de integridad, pero que ademas de
especificar el "id" del nivel superior, especifique a que nivel
exactamente esta haciendo referencia. Me explico con un ejemplo

create table provincias (
id_provincia serial primary key,
nombre text not null
);

-- los departamentos siempre pertenecen a una provincia
create table departamentos (
id_departamento serial primary key,
nombre text not null,
id_provincia int not null references provincias
);

-- un municipio puede pertenecer a un departamento o a una provincia
create table municipios (
id_municipio serial primary key,
nombre text not null,
id_superior int not null, -- no puedo poner "references"
tipo_superior "char" check (tipo_superior in ('d', 'p'))
);

-- Una localidad puede pertenecer a un departamento, a un municipio,
-- o ser el del distrito federal
create table localidad (
id_localidad serial primary key,
nombre text not null,
id_superior int not null, -- no puedo poner "references"
tipo_superior "char" check (tipo_superior in ('d', 'm', 'f'))
);

Y ahora te toca armar triggers que verifiquen la integridad segun
corresponda: que si el tipo_superior es 'd' entonces hay que buscar en
la tabla departamentos, o si 'm' en municipios, etc.

Lo malo de este modelo es que no puedes completar una linea de jerarquia
con una sola consulta ...
-------->-------->-------->-------->-------->-------->-------->-------->

Otra idea es usar una tabla plana, con todos los elementos (municipios,
departamentos, localidades, provincias), ponerle un campo "tipo" y luego
hacer self-joins para obtener la jerarquia. Aca puedes usar una
representacion para acelerar busquedas que indique, para cada hoja del
arbol de jerarquia, como llegar hasta la raiz. Por ej. si la localidad
99, pertenece al municipio 142, el cual pertenece al depto 75 y este a
su vez a la provincia 3, podrias almacenar un campo en "localidades" que
para ese registro sea m142/d75/p3. Si fuera del municipio 142 el cual
estuviera en la provincia 3, podrias llamarlo m142/p3 (te saltas el d).
Observa que basta con dos consultas para completar el arbol entero --
primero obtienes el nodo de interes y despues obtienes todos los
elementos mencionados ahi.

Claro que si quieres tener "todas las localidades en el departamento 55"
se complica un poco la cosa.
-------->-------->-------->-------->-------->-------->-------->-------->

Otra idea es usar algo parecido a lo anterior, pero tener en cada
elemento un conjunto ordenado de enteros (ya sea como int[] o como
varias columnas int) que indiquen la jerarquia hacia arriba donde
correspondan. Esto duplica mucha informacion (todas las localidades van
a tener repetido a que provincia pertenece el municipio), pero permite
consultar todo en dos consultas, incluida la de "todas las localidades
en el departamento 55".

... en este momento no se me ocurre nada mas pero sospecho que hay
mejores maneras de hacerlo. En tu lugar plantearia, ademas de que es lo
que quieres representar, cuales son las consultas que quieres responder
eficientemente.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Nicolás Domínguez Florit 2006-02-08 12:08:23 Re: [pgsql-es-ayuda] Deferrable ¿funciona?
Previous Message badillo 2006-02-08 09:15:09 Ayuda urgente, necesito enviar correos desde postgres.