Pensando en Geek

Personal, Linux, Programación

Primary keys con PHP

Dvorak en Linux, SL, aplicaciones con fecha 19/febrero/2006 - 2 comentarios
Etiquetado con: linux, sl, aplicaciones

Hoy les mostraré un trozo de código que aplique a mi proyecto de termino de carrera, y como todos sabemos MySQL, Postgresql, MaXDb, SQL Server y demas manejadores de BD, soportan gran cantidad de registros por tabla, manejaré el caso de una sola tabla para explicar mejor esta situación.

Supongamos que tenemos una BD relacional, y dentro existe una tabla que contiene un millón de registros, y el ID es un numero consecutivo. en este caso nuestro ID tendría una longitud máxima de 7 caracteres ('1000000'), y el máximo de registros que podriamos tener sería el numero 9999999. La cuestión es que si tengo 1000000 de registros de 7 caracteres de longitud, entoces en mi BD habría 700000 de caracteres guardados solamente en el campo ID (1000000 registros * 7 caracteres).

¿Como puedo reducir la cantidad de caracteres guardados en mi BD, teniendo el mínimo de caracteres?

En mi caso utilice un ID en formato hexadecimal, aunque tambien podría ser en forrmato vigesimal o algún otro.

La longitud de mi campo ID es de 6 caracteres, y el número de registro máximo sería el FFFFFF (en decimal 16777215), suponiendo que hasta la fecha haya añadido 1000000 de registros mi ID sería el numero hexadecimal F4240 y habría 6000000 de caracteres guardados solamente en el campo ID (1000000 registros * 6 caracteres). Por lo tanto en cada millón de registros me ahorraría un millón de caracteres, la reducción total de caracteres seria de 16,777,215

Nota:
Actualmente la BD de bodega que tengo tiene un tamaño de 12 GB.

Ahora muestro el código utilizado para tal fin, aunque es muy sencillo me ayudo bastante.
********************** BEGIN CODE PHP **********************
$ssql = "SELECT * FROM tabla";
$rs = mysql_query($ssql,$conn);
if (mysql_fetch_array($rs) != 0)
{
$rs = mysql_query($ssql,$conn);//iniciamos el recordset en la primera posición
$id = heXDec(mysql_insert_id($connectid) + dechex(1));
}
else //en caso de no haber ningun registro se crea el primero.
{ $id=1;}
********************** END OF CODE PHP **********************
La primera forma que utilice fue:

$ssql = "SELECT * FROM tabla";
$rs = mysql_query($ssql,$conn);
if (mysql_fetch_array($rs) != 0)
{
$rs = mysql_query($ssql,$conn);//inicio el recordset en la primera posición
while ($row=mysql_fetch_array($rs))
{
$id=dechex(heXDec($row["idprimario"]) + dechex(1));}
}
else
{ $id=1;}

Sin embargo el while se cicla hasta el obtener el último registro y se autoincrementa, el problema es que si se tienen demasiados registros el proceso puede ser un poco lento.

Nota: dechex(1), es para referirse a la suma en hexadecimal

Comentarios

ví numertos y letras repetidas y mi cerebro se blokeó, interesante efecto, hice como corto circuito.

maYa | 21-02-2006 22:02:22

Jajajajajaja, lo sé, algunas veces después de ver tanto código me siento como un zombi , y cuando observo alrededor pareciera que el mundo se contrea y expande rapidamente. Muy bueno tu blog

Saludos

Dvorak | 22-02-2006 21:52:13

Comentar


Categorías

Estadísticas

  • 1283 días on-line
  • 209 anotaciones
  • 251 comentarios
  • 1 referencias
ADN.esADN.es Medio Oficial Premios Bitacoras 2008: Horoscopo