Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Utilizar INT o VARCHAR en claves

Estas en el tema de Utilizar INT o VARCHAR en claves en el foro de Bases de Datos General en Foros del Web. Hola a todos. Hace bastante tiempo que no me paso por aqui y me gustaria que alguien me ayudase con este problemilla. Estoy haciendo una ...
  #1 (permalink)  
Antiguo 18/12/2012, 17:55
 
Fecha de Ingreso: febrero-2009
Mensajes: 472
Antigüedad: 15 años, 10 meses
Puntos: 14
Utilizar INT o VARCHAR en claves

Hola a todos.

Hace bastante tiempo que no me paso por aqui y me gustaria que alguien me ayudase con este problemilla.
Estoy haciendo una aplicación web y no se hasta que punto puede crecer los campos en las tablas de la base de datos, por lo que a la hora de crear las claves primarias, nose si usar INT, BIGINT, o un VARCHAR formado por caracteres que forme un codigo único.
En un principio habia pensado en un BIGINT, pero creo que es un campo demasiado pesado. Tambien se me paso por la cabeza que la clave sea un VARCHAR formado por digitos y letras aplicando alguna lógica para que me quede una clave que sea unica, pero nose si los VARCHAR a la hora de indexarlos con otras tablas, son mas lentos que si se tratase de un INT. Estoy usando una base de datos MYSQL.

Espero que alguien me pueda ayudar.

Muchas gracias de antemano.

Un saludo
Pinty
  #2 (permalink)  
Antiguo 19/12/2012, 07:06
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: Utilizar INT o VARCHAR en claves

Desde luego yo usaría un número autoincremental y sin signo (así te da para más números). Mira en la tabla hasta cuantos valores da un tipo de dato y cuantos crees que necesitaras:
http://dev.mysql.com/doc/refman/5.0/...ric-types.html

Un int sin signo te da para 4294967295 registros. Te es suficiente? Sino cuento mal son 4294 millones de registros.

Última edición por alyciashape; 19/12/2012 a las 08:47
  #3 (permalink)  
Antiguo 19/12/2012, 09:10
 
Fecha de Ingreso: febrero-2009
Mensajes: 472
Antigüedad: 15 años, 10 meses
Puntos: 14
Respuesta: Utilizar INT o VARCHAR en claves

Hola alyciashape. En primer lugar muchas gracias por contestar.
El problema es justo ese, nose hasta que punto puede crecer la base de datos. Podia poner un bigint sin signo y asi olvidarme por que no creo que la tabla crezca hasta esos niveles, pero claro el tamaño que ocuparia se veria incrementado. Tambien habia pensado usar un varchar, por ejemplo una tabla "personas" y que la clave fuese el DNI seguido de algun caracter mas para evitar dni duplicados, por ejemplo el dni seguido de la hora minuto y segundo de registro, pero nose si al usar esa clave como clave foranea en otra tabla, al ser un varchar sea mas lento que un campo numerico. Yo en realidad soy programador, nunca he diseñado una base de datos, solo he hecho consultas sobre ellas. Se crear bases de datos pero nose como hacerlo de manera eficiente.

Muchas gracias nuevamente por todo

Un saludo

Pinty
  #4 (permalink)  
Antiguo 19/12/2012, 09:15
Avatar de 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
Puntos: 2658
Respuesta: Utilizar INT o VARCHAR en claves

En realidad, si bien usar PK numéricas tiene algunas ventajas, el principio sobre el que se basa la elección de una PK no es ese.
El tema se explica muy claramente cuando se estudia Análisis de Sistemas, o bien los Fundamentos de Bases de Datos, y tiene que ver con el modelo Entidad-Relación.
Una de las principales reglas del modelo especifica que toda entidad (representación de una clase en el sistema) debe tener una clave primaria que sea capaz de identificar unívocamente una instancia de esa entidad en todo el universo de instancias que la entidad puede tener.
Pero esa identidad debe surgir de la Entidad misma, es decir, debe ser algún atributo (dato) o conjunto de atributos que no se repita jamás en otra instancia de la misma entidad, y que pueda servir para identificar esa única instancia.
¿Se entiende el concepto?
Cuando, luego, se pasa a el modelo físico (tablas), en principio sigue siendo eficiente: Usar una clave que sea atributo de la entidad que la tabla representa, siempre es la mejor opción. El qué tipo de dato es, es conceptualmente irrelevante. Lo importante es que sea:
- Unico.
- No nulo.
Sobre la base de esa idea, usar un numero de documento, folio de partida de nacimiento, combinacion empresa+sucursal+numero def actura, hora de ocurrencia+identificador de otro objeto, etc., son todas formas posibles de implementar una PK. Y todas ellas pueden ser muy funcionales.
¿Por qué se usan entonces las claves numéricas autoincrementales?

Según vemos los que nos dedicamos a la arquitectura de datos, la respuesta es simple: Porque la mayoría de los programadores no entiende de bases de datos, porque les resultan fáciles al asociarlas a objetos de programación (arrays, diccionarios), y por simple vagancia (sin ofender).
Lo cierto es que razonar como DBA y razonar como programador son dos modos completamente distintos, y eso hace que algunas cosas del diseño de las bases de datos sean poco comprensibles para los programadores. Por eso prefieren meter con forceps una PK numérica, antes que ponerse a mirar el modelo de datos desde esa óptica, simplemente lo entienden mejor.

Hay unas pocas ventajas en usar una clave primaria numérica:
1) Son más rápidas en las búsquedas, porque su matching es binario, lo que aprovecha directamente los recursos del hardware (UAL).
2) Ocupan menos espacio (máximo 8 bytes o 64 bits).
3) Son fáciles de recordar para el usuario, en el caso del ingreso y validación de datos.
4) Son sencillos de poner en las sentencias, ya que no requieren conversiones ni charsets.

Tienen algunas desventajas en el uso:
1) Generan problemas para integración de datos, ya que diferentes instancias de una misma clase pueden estar usando el mismo ID numérico si están en bases de datos separadas.
2) Generan serios problemas ante truncados accidentales o intencionales, ya que el reinicio de los números produce serios problemas de consistencia histórica.
3) No permiten una fusión de datos sin necesidad de largas tareas de migración que compense los diferentes IDs. Y como ese ID muy probablemente sea FK en otras tablas, la cadena de dependencias debe ser tomada en cuenta en esa migración, haciendo la tarea más compleja.
4) El borrado de datos genera discontinuidades que los usuarios no comprenden y resulta difícil explicar por qué no se deben "llenar".
5) Otros... muchos otros (puse sólo algunos).

Por su lado, una PK basada en atributos propios tiene muchas ventajas:
1) No causa problemas de consolidación ni integración (cada ID es único en todo sentido).
2) El borrado o truncado accidental no produce conflictos con los backups.
3) Si las PK son numéricas (aunque no AI) o de fecha y hora, conserva todas las ventajas de una AI, sin ninguna de las desventajas.
4) Como son atributos propios, las búsquedas son más rápidas ya que los datos importantes se recuperan al mismo tiempo (mejora el uso de índices).
5) Consume menos tiempo de red, al no tener que traer datos no relevantes (los AI).
6) Otros...

Como desventajas, este otro tipo de claves pueden tener:
1) Suelen ser más largas, y eventualmente si se usan VARCHAR volverse un poco lentas en ciertos casos.
2) Los índices pueden ser más grandes.
3) Al programador puede darle más trabajo depurar las consultas por errores de programación no muy visibles.
4) Los usuarios no comprenden bien la lógica de usar tipos de claves no numéricas, por lo que esto debe ser completamente transparente para ellos.

Resumiendo: Si lo analizamos como sistema, es mejor usar claves que sean atributos propios, y no crearlas artificialmente sólo porque sea cómodo. A la larga produce más beneficios.
Por otro lado, se suele sugerir usar claves numéricas en las tablas (para simplificar el proceso) si, y sólo si llegados a la normalización y estando en la 3FN (ver Formas Normales en Wikipedia) aún no se ha determinado una clave candidata, o no una eficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 19/12/2012, 09:31
 
Fecha de Ingreso: febrero-2009
Mensajes: 472
Antigüedad: 15 años, 10 meses
Puntos: 14
Respuesta: Utilizar INT o VARCHAR en claves

Hola gnzsoloyo.
En primer lugar muchas gracias por tu comentario, la verdad que ha sido una explicación impresionante y al leerla me he dado cuenta de mas cosas que me pueden ser de mucha ayuda. Lo que mas me preocupaba, era que no se hasta que punto puede crecer esta base de datos y por otro lado como bien dices soy programador, no dba, lo cual hace que pensando como programador no trabaje de manera tan eficiente como haria un dba.
Parece que esta claro que si uso un atributo (o conjunto de atributos) propio de la tabla, sin forzar un autoincremental es mejor, por lo que he analizado de tu comentario; por otro lado tambien veo que me comentas, que la clave es mejor que sea un dato numerico, ya que asi la velocidad de la consulta seria mayor, pues ahi esta mi principal problema.
Si uso un bigint, me puedo cubrir la espalda por que no creo que nunca se supere ese numero tan impresionante de registros, pero por desgracia eso nunca se sabe (la verdad que si se supera mi jefe se va a llevar una alegria jajaja), y claro si uso un varchar ese problema no lo tendria dado que puedo definir un tamaño muy grande de datos.

Por lo que veo tu eres dba. Imaginate por ejemplo la pagina de amazon que tiene una cantidad brutal de productos. Imaginate la tabla "productos" donde se almacenan todos los productos y que tenga un INT de clave primaria, no crees que se superaria el tamaño maximo??, pongo de ejemplo la pagina de amazon por que me parece un buen ejemplo de base de datos grande.
Siento mucho mi ignorancia en este campo, es que es la primera vez que me enfrento a un reto asi.

Muchas gracias por todo nuevamente.

Un saludo
Pinty
  #6 (permalink)  
Antiguo 19/12/2012, 09:59
Avatar de 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
Puntos: 2658
Respuesta: Utilizar INT o VARCHAR en claves

Algunas veces me han hecho preguntas parecidas, y suelo explicarlo de esta forma:
Un INT UNSIGNED tiene un rango de representación de 0 a 4.294.967.295. Con ese tipo de dato, si ingresases 1.000.000 registros diarios, necesitarías 11,76 años para usar todo el rango.
Si eso no te resulta suficiente, puedes usar un BIGINT UNSIGNED, como piensas, que podría resistir tranquilamente que metas 1.000.000 registros por día... durante 50.507.992.209,4 años.

Creo que con cualquiera de los dos te alcanzará.

¿No crees?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 19/12/2012, 11:37
 
Fecha de Ingreso: febrero-2009
Mensajes: 472
Antigüedad: 15 años, 10 meses
Puntos: 14
Respuesta: Utilizar INT o VARCHAR en claves

Hola gnzsoloyo. Una vez mas muchas gracias. Con esta ultima explicación que me has dado no me ha podido quedar mas claro.

Me estoy documentando sobre la normalización de una base de datos y procesos de mantenimiento de la misma, la verdad que es un tema muy interesante, voy a intentar hacer la base de datos mas eficiente posible con la documentación que tengo recopilada.

Muchas gracias nuevamente por dedicarme tu tiempo a ayudarme.

Un saludo.
Pinty

Etiquetas: campos, claves, int, mysql, tabla, varchar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:03.