Re: Estructura tipo diccionario o hashset

From: Eduardo Morras <emorrasg(at)yahoo(dot)es>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Estructura tipo diccionario o hashset
Date: 2016-08-26 10:18:51
Message-ID: 20160826121851.08e05962dd78e637d039d54f@yahoo.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Wed, 24 Aug 2016 13:52:41 +0200
José Hurtado <jhurtadom(at)gmail(dot)com> wrote:

> Hola,
>
> Creo que vendría bien tener algo parecido a:
>
> DECLARE
> dic1 HASHSET(varchar, schema_name.table_name);
> -- format: HASHSET(anytype, anytype)
> ...
> BEGIN
> ...
> ...
> IF (hashset_has_key(dic1, "alfa") THEN
> dic1["alfa"] := (val1, val2)::schema_name.table_name;
> -- O: hashset_update(dic1, "alfa", (val1,
> val2)::schema_name.table_name);
> ELSE
> hashset_add(dic1, "alfa", (val1, val2)::schema_name.table_name);
> END IF;
> ...
> hashset_remove(dic1, "alfa");
>
> ...
> END;
>
> Ahora estoy implementando algo parecido con tablas temporales, pero
> creo que con una estructura así se podrían resolver mejor ciertos
> algoritmos.

... Estrictamente hablando, una tabla de una base de datos es un set o conjunto. Un hashset usa un indice de tipo hash para acceder(leer, borrar, actualizar, crear) a la informacion del set y un diccionario es otro tipo de set. En tu codigo en pg/pl, hashset_add seria el equivalente a un INSERT, hashset_remove a un DELETE, todas la operaciones sobre un set se pueden hacer en sql. La unica diferencia entre tu algoritmo y una tabla normal de postgresql estriba en que quieres usar un hash para acceder a la informacion, pero por debajo postgres usara un btree, con lo que el coste final del algoritmo sera la del btree mas el coste de ejecutar tu codigo. O bien no he entendido que quieres hacer o no creo que vaya a suponer una mejora.

Opciones que se me ocurren:

a) Puedes usar un indice tipo hash en vez de btree en postgres sin embargo tiene sus inconvenientes.
b) Puedes usar arrays en las columnas(https://www.postgresql.org/docs/current/static/arrays.html).
c) Usa una implementacion de hashtable o diccionario (hypertable p.ej) y accede a ella por FDW.
d) Usa plpython, ya tiene tipos de hashtable y diccionario.
e) O como ya te han sugerido, usa Jsonb.

Seguro que hay mas opciones, no obstante, mide el rendimiento de cada una.

> Un saludo.

--- ---
Eduardo Morras <emorrasg(at)yahoo(dot)es>

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Francisco Olarte 2016-08-26 10:23:55 Re: Estructura tipo diccionario o hashset
Previous Message José Hurtado 2016-08-26 09:31:19 Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Ayuda con función...