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