Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] SOT: Ayuda con diseño de BD

From: Jose Luis Balle <joseluisballe(at)gmail(dot)com>
To:
Cc: Javier Chávez B(dot) <jchavezb(at)gmail(dot)com>, rperezm(at)uci(dot)cu, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] SOT: Ayuda con diseño de BD
Date: 2009-10-28 13:36:02
Message-ID: 6d87542d0910280636o3e6eae48g657101604f3a26a5@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Lo Prometido.
La tabla:
CREATE TABLE items
(
id serial NOT NULL,
padre bigint NOT NULL,
nombre character varying(300) NOT NULL,
descripcion text,
CONSTRAINT items_pkey PRIMARY KEY (id)
)
WITH (OIDS=TRUE);

La función, en realidad como recursiva, tantas veces como sea
necesario hasta llegar a la última hoja -1 que es la hoja en sí, el
registro.
CREATE OR REPLACE FUNCTION getancestor(este character varying, item integer)
RETURNS character varying AS
$BODY$
DECLARE
retorno integer;
BEGIN
SELECT padre INTO retorno FROM items WHERE id=item;
IF NOT FOUND OR retorno=0 THEN
return este;
ELSE
return getancestor(retorno::varchar||'.'||este,retorno);
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' STABLE
COST 100;
ALTER FUNCTION getancestor(character varying, integer) OWNER TO user;

Y no anda tan mal, 391ms sobre 1678 filas, lo que en realidad me toma
mucho tiempo es una vista que me sumariza cada hoja del árbol
Seq Scan on items (cost=0.00..480.28 rows=1678 width=159)

En fin, no se si es lo mejor pero por ahora me sirve.
Voy a investigar tu recomendación Alvaro, gracias.
Saludos

El día 27 de octubre de 2009 23:00, Alvaro Herrera
<alvherre(at)alvh(dot)no-ip(dot)org> escribió:
> Jose Luis Balle escribió:
>> Yo tengo implementado una especie de rubro sub-rubro de la misma
>> forma, pero a la hora de retornar el codigo 1.1.2.4 hice una función
>> de agregación pero me toma mucho tiempo. Está bien que el fierro no
>> acompaña pero sobre 4000 registros demora su tiempo.
>> Mañana subo la función y te paso bien los tiempos.
>> De todas formas no conozco otra forma de implementar jerarquía en
>> bases de datos relacional
>
> El problema es que tienes que recorrer la tabla cuatro veces para
> encontrar la descripción.  Puedes usar ltree para hacerlo más rápido.
> Es un módulo contrib, usa índices GiST si mal no recuerdo.
>
> En Postgres 8.4 una de las novedades es la funcionalidad WITH RECURSIVE
> que permite responder en una sola consulta esta clase de cosas, mucho
> más simple y seguramente más rápido que cualquier otra forma de hacerlo.
>
> --
> Alvaro Herrera       Vendo parcela en Valdivia:  http://rie.cl/?a=255568
> "El sabio habla porque tiene algo que decir;
> el tonto, porque tiene que decir algo" (Platon).
>

--
“Frecuentemente me preguntan en las conferencias: ¿por qué deberíamos
creerles a ustedes los escépticos? Mi respuesta es: no deberían
creernos. No deberían creer a nadie basándose en la autoridad o
posición que esta persona tenga. ”
Michael Shermer

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message José Sena 2009-10-28 13:53:48 Problemas con cifras o redondeno
Previous Message suso 2009-10-28 13:21:54 Re: otra de auditoría