Ver Mensaje Individual
  #3 (permalink)  
Antiguo 03/06/2009, 10:05
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 1 mes
Puntos: 2658
Respuesta: Decidir entre un tipo Caracter o Entero para un Campo de Índice

Hay varias razones para preferir los ID numéricos, pese a que el modelo relacional normalizado indica que sólo se los debe usar cuando no existen claves candidatas o determinantes de una relación:

- Por un lado es tradicional el uso de numeración para identificar registros, resabio de los archivos en papel.
- Por otro lado, a nivel de almacenamiento, es mucho menor el espacio usado por un valor numérico que por un conjunto de caracteres. Piensa que con 4 bytes (2^64-1 bits) se pueden almacenar 18.446.744.073.709.551.615 valores distintos, mientras que para hacer eso con los caracteres, necesitarías la capacidad de un campo BLOB o un campo TEXT.
- Esto permite construir tablas relacionales de menor tamaño, en especial en aquellos casos en que son las que controlan las relaciones N:N entre múltiples tablas (una tabla que agrupe 20 claves diferentes solamente tiene 80 bytes por registro como mucho).
- Además, los índices basados en valores numéricos son más eficientes y rápidos que los basados en caracteres.
- Los valores numéricos usados como auto_increment son más sencillos de programar y no requieren validación desde las aplicaciones, ya que se implementan a nivel de DDL.

Obviamente esto trae aparejado cierto tipo de problemas de orden teórico, entre los que se cuenta que las claves generadas así no resultan representativas de las relaciones que vinculan o de los registros que identifican, y no sirven para crear consultas fáciles de comprender (mnemotécnica) sin saber a qué tablas referencia, pero eso es otro asunto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)