Re: [pgsql-ayuda] HOLA lista pgsql-ayuda

From: Gunnar Wolf <gwolf(at)campus(dot)iztacala(dot)unam(dot)mx>
To: pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Cc: rflores(at)jonima(dot)com(dot)mx
Subject: Re: [pgsql-ayuda] HOLA lista pgsql-ayuda
Date: 2000-04-27 15:29:48
Message-ID: Pine.LNX.4.10.10004270951500.5419-100000@campus.iztacala.unam.mx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

> El dia de hoy se me han presentado tres problemas de concepto para seguir
> desarrollando mis aplicaciones con postgresql3:
>
> 1. Para la creacin de indices se me presentan 3 tipos de algoritmos:
> BTREE, RTREE y HASH, no se cuales son las diferencias y en que caso me
> conviene usarlos. Ademas, queria saber si creo un indice, al realizar una
> consulta ordenada por la llave del indice, el sistema toma el indice de
> manera automatica.

El RTREE no lo conozco, pero el BTREE y el HASH son dos algoritmos muy
comunes y para diferentes aplicaciones. Basicamente, el BTREE (arbol
binario) es mas eficaz en tanto a memoria/espacio utilizado y responde
mejor a conjuntos de datos en los que se repiten o coinciden llaves. El
HASH es mucho mas rapido, pero ocupa un mucho mayor espacio, y puede
volverse mas lento si coinciden las posiciones de las llaves.

Explico un poquito mas a fondo: En un arbol binario (BTREE) cada nodo
puede tener dos hijos (izquierdo y derecho, por convencion). Si insertas
un nuevo nodo (o dato), es comparado con el nodo raiz del arbol. Si es
menor que este, tomas como raiz el hijo izquierdo y vuelves a comparar. Si
es mayor o igual, tomas como raiz el hijo derecho y vuelves a comparar. Lo
colocas en el punto en que encuentres un nodo sin hijo del lado que
buscas. Claro, un arbol se puede desbalancear y convertirse en muy poco
eficiente, pero por lo general, en este tipo de aplicaciones los arboles
incluyen un algoritmo de manutencion del balance.

El hash es una tabla de una longitud determinada (usualmente, un numero
primo grande), al cual basta aplicar una funcion sencilla y rapida para
encontrar donde esta/debe estar un registro dado. Obviamente, si pones dos
valores que coincidentemente caigan en el mismo lugar (como 123 y 224 en
un hash de 101 posiciones) tienes que tener un algoritmo que te permita
guardarlos sin sobreescribirlos.

> 2. Yo quiero hacer descargas parciales de una tabla de postgres sobre una
> pagina WEB. Estaba pensando si la funcion SELECT tiene algun parametro en
> el que le pueda especificar el numero maximo de registros que me
> despliegue de la tabla.

Con que lenguaje lo quieres hacer, con Perl? SQL (me parece) no implementa
ningun mecanismo para hacer lo que pides, pero con Perl puedes indicar que
cree un statement handler:

$sth = $dbh->prepare($sql);
$sth->execute;

Despues de eso, vas jalando renglon por renglon. Probablemente haya una
manera mas limpia de brincarte los que no vayas a requerir, pero
considera:

for ($tmp=0;$tmp<$num_a_descartar;$tmp++) {
@row=$sth->selectrow_array;
}
for ($tmp=0;$tmp<$registros_que_quiero_mostrar;$tmp++) {
@row=$sth->selectrow_array;
&muestra(@row);
}

> 3. Quisiera realizar la validacion de un campo que no es llave para evitar
> que se duplique, existe la funcion UNIQUE que la puedo utilizar al momento
> de crear la tabla, si yo intento insertar el registro el sistema me
> enviaria un error. Hay manera de que pueda utilizar el identificador del
> error para que no truene la aplicacion y que le envie un pantallazo al
> usuario para que cambie el valor del campo?
> En caso de que no pueda utilizar esta solucion tendria que utilizar una
> consulta con un SELECT para verificar que no se haya insertado este valor.
> Existira alguna funcion que me regrese en una bandera el status de si
> existe el valor?

Eso de nuevo depende del lenguaje en el que estes implementando. Cuando
haces esto en Perl siempre recibes un valor de regreso (por convencion,
$rv). Este lo puedes revisar:

Tengo una base de datos dir_ip en la que el campo ip es llave primaria,
por tanto incluye UNIQUE. Tengo ya registrado un host como 132.248.79.80,
pero no como 127.0.0.1. Ejecuto el siguiente programita en Perl:

use DBI;
$dbh=DBI->connect("dbi:Pg:dbname=dir_ip","nobody") or die;
$sql="insert into dir_ip (ip,hostname) values ('132.248.79.80','ya_existe');";
$rv=$dbh->do($sql);
print "rv es $rv\n";
$sql="insert into dir_ip (ip,hostname) values ('127.0.0.1','localhost');";
$rv=$dbh->do($sql);
print "rv es $rv\n";

al correr, manda a STDERR la linea DBD::Pg::db do failed: ERROR: Cannot
insert a duplicate key into a unique index (eso ya te dejo a ti
resolverlo, no es demasiado complejo). A STDOUT me imprime:

rv es
rv es 1

O sea, puedo revisar si fue exitoso de la siguiente manera:

if ($rv) {
&exitoso;
} else {
&error;
}

Suerte!

-------------------------------------------------------------------
Gunnar Wolf gwolf(at)campus(dot)iztacala(dot)unam(dot)mx
Universidad Nacional Aut�oma de M�ico, Campus Iztacala
Jefatura de Secci� de Desarrollo y Admon. de Sistemas en Red
Area de Seguridad en Computo - DCI - DGSCA - UNAM
-------------------------------------------------------------------
Beginner thinks 1Kb == 1000 bytes. Master knows 1Km == 1024m

--------- Pie de mensaje -------------------------------------------
Archivo historico: http://tlali.iztacala.unam.mx/maillist/pgsql-ayuda
Cancelar inscripcion:
mail to: majordomo(at)tlali(dot)iztacala(dot)unam(dot)mx
text : unsubscribe pgsql-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Estrella Dominguez 2000-04-27 16:00:12 Re: [pgsql-ayuda] Re: Organizacion de numeros
Previous Message Raul Flores 2000-04-27 14:47:57 [pgsql-ayuda] HOLA lista pgsql-ayuda