Identificador único en Jerarquía

From: will <wrbutros(at)rizoma(dot)cl>
To: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Identificador único en Jerarquía
Date: 2012-03-21 19:34:02
Message-ID: 4F6A2D2A.3060106@rizoma.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos!...
Hace poco envié un correo a la lista consultando por una query recursiva
que me permitiera
conocer todos los componentes de una mercadería (componentes que a su
vez podían tener otros componentes), la cual resultó exitosa.
(http://grokbase.com/t/postgresql/pgsql-es-ayuda/123588qv4j/funci%C3%B3n-recursiva)

Mi situación actual:
-------------------------------
A modo de recuento:
Estoy creando un POS bajo la GPL , que me permita controlar mercaderías
compuestas
(una mercadería virtual que contiene dentro de sí otras mercaderías),
algo así como son las
ofertas (1 pan + 2 galletas por X $$), pero también hay otros casos más
complejos como
un plato de comida, un pastel, etc...

Ahora sucede que necesito registrar en una tabla (al momento de vender
un compuesto)
todos los componentes (y sub componentes) de la mercadería en cuestión,
detallando la cantidad
requerida de cada componente, entre otras cosas.
De manera que a futuro pueda saber que componentes (con sus detalles)
participaron de ésta mercadería
en el momento mismo de la venta. Esto último es necesario porque también
se podría dar el caso
que se desee cambiar algunos componentes o sus detalles a futuro.
(Algo muy común si se desean reemplazar solo algunos componentes de un
plato, o mercadería preparada:
algo así como cambiar mantequilla por manteca en un pan)

El problema:
---------------------
Hasta el momento todo iba bien, pero sucede que para efectos de informe
a futuro
necesito saber con exactitud que componente era de qué compuesto, y esto
se complica
cuando el nivel de jerarquía se extiende demasiado, y los componentes se
repiten en distintos compuestos
o el mismo compuesto se repite en diferentes niveles:

Para ser más concreto, les doy un Ejemplo:

Ejemplo 1:
------------------
http://pastebin.com/K5cwgT6C

Aquí se puede ver que:
* I es hijo de E e hijo de J
* I a su vez tiene hijos M y N

Hasta este momento no tengo como identificar a qué I pertenece cada M y N

Traté de solucionar el problema creando un ID vector que contuviese
ciertos datos,
como el nivel de gerarquía, un id de hijo propio, y un id de padre...

Quedando:
------------------
http://pastebin.com/SzNtfY1Y

Esto soluciona el caso de M y N que pertenecen a I, pero de distintos
niveles de jerarquía

El problema de esto es que pueden haber mercaderías "repetidas" dentro del
mismo nivel de jerarquía, y no tengo forma de identificar a su padre
verdadero, como es el caso de
como es el caso de U y V.

Además en la consulta recursiva agregué la clausula row_number() over
(), esto le da un id al hijo
pero ese id es único solo dentro de su padre.

Pregunta:
---------------------------------

Cómo puedo hacer que esta consulta

WITH RECURSIVE compuesta (Madre, Hijo, id) AS
(
SELECT madre, hijo,
ARRAY[0, --id_único] AS id_madre
FROM componente_mc WHERE madre = A
UNION ALL
SELECT componente_mc.madre, componente_mc.hijo,
ARRAY[id_madre[2], --id_único],
FROM componente_mc, compuesta
WHERE componente_mc.madre = compuesta.hijo
)
SELECT Hijo, Madre
FROM compuesta

pueda generar un id único como identificador (donde dice --id_único), y
que no se repita en ningún padre?,
de forma que quede como el siguiente ejemplo :

http://pastebin.com/nc1YNUkQ

De antemano,
Muchísimas gracias! =)

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2012-03-21 21:58:24 Re: [pgsql-es-ayuda] Identificador único en Jerarquía
Previous Message Marcos Michel Martinez Perez 2012-03-21 19:20:08 Re: errorSaludos