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

[SOLUCIONADO] Es conveniente definir un ID autoincrementable como clave de cada tabla?

Estas en el tema de Es conveniente definir un ID autoincrementable como clave de cada tabla? en el foro de Mysql en Foros del Web. Estoy acabando de diseñar la base de datos para un proyecto. Es el primer proyecto grande y no orientado de forma didactica que voy a ...
  #1 (permalink)  
Antiguo 06/05/2013, 05:50
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 3 meses
Puntos: 5
Es conveniente definir un ID autoincrementable como clave de cada tabla?

Estoy acabando de diseñar la base de datos para un proyecto. Es el primer proyecto grande y no orientado de forma didactica que voy a realizar. Y mi pregunta es la siguiente.

¿Es aconsejable definir una ID autoincrementable como clave primaria en cada una de las tablas ?

He consultado por internet y hay mucha ambiguedad en el asunto, algunos dicen que este seria el buen funcionamiento, y otros dicen todo lo contrario. Tras leer mucho y ver los motivos de unos y otros, saco la conclusion de que es mejor crear las tablas con ID autoi... en lugar de utilizar atributos unicos (dni, email, etc ) ya que podemos encontrarnos con diversos problemas que en un princpio no habiamos planteado (por ejemplo un niño que aun no tiene dni ) ademas de que las atributos añadidos por la logica humana a la larga suelen acarrerar errores, pero los añadidos por la logica de la maquina (1, 2, 3, 4, ... ) deberian ser mas estables.


Cual es vuestra opinion ? algun experto diseñando o manteniendo grandes bases de datos ?
  #2 (permalink)  
Antiguo 06/05/2013, 06:40
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Es conveniente definir un ID autoincrementable como clave de cada tabla?

La creación de índices no tiene nada que ver con los problemas que planteas.
El ID autoincremental se utiliza para IDENTIFICAR de forma definitica un registro.
Los índices tienen como objetivo acelerar las búsquedas y mantener la integridad de los datos.
Utilizar un auto_increment como índice no tiene sentido dado que incialmente, el id asignado será aleatorio y no relacionado con el contenido de la fila. Además, el campo auto_increment, estará siempre correctamente ordenado. Consulta la documentación del mysql_server al respecto.
Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 07/05/2013, 04:17
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 3 meses
Puntos: 5
Respuesta: Es conveniente definir un ID autoincrementable como clave de cada tabla?

Gracias por contestar. pero yo creo que no has entendido mi pregunta, no he entendido tu respuesta, o no he sabido explicarme correctamente, ya que precisamente la creacion de indices si que tiene que ver con el problema que planteo.


yo comunmnete, cuando asociaba tablas (por ejemplo usuario y libros, en donde tenemos una relacion 1 a muchos ) lo hacia por un atributo exclusivo de la tabla adecuada ( por ejemplo pasaria el nickname de los usuarios a la tabla libros y asi se generian filas como estas - libro: el quijote, autor: cervantes, user: pepe | - libro: la divina comedia, autor:dante, user: pepe. ) y en caso de no exisitir un dato exclusivo cogia 2 atributos para poder formar asi una clave externa compuesta .


lo que planteo (y veo que aconseja mucha gente) es olvidarse de coger atributos para asociar tablas y hacerlo mediante el id autoincrementable que podemos colocar en todas las tablas. por lo tanto tendriamos algo asi. ( - libro: el quijote, autor: cervantes, id-user: 1111 | - libro: la divina comedia, autor:dante, id-user: 1111 )

no se si queda bien explicado. espero que si.


que podemos ganar con esto ? que podemos perder ? pues esa es mi pregunta, por lo que he visto hay diversidad de opiniones, pero uno de los factores que me hacen decantarme por usar esta segunda metodologia es que algunos frameworks como symfony utilizan por defecto este sistema de ingteractuar entre tablas.

saludos
  #4 (permalink)  
Antiguo 07/05/2013, 06:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Es conveniente definir un ID autoincrementable como clave de cada tabla?

Cita:
frameworks como symfony utilizan por defecto este sistema de ingteractuar entre tablas.
Por empezar, cuando hablamos de Bases de DAtos, olvídate de los frameworks. No existen para las bases de datos, es programación, y lo que hacen los fmwk no abarca la las decisiones de diseño que se tomen.
Incluso se puede decir que muchas veces son contraproducentes para la performance, porque aplican un concepto no necesariamente eficiente del uso de las bases de datos.

El tema en si, es largo, algo complejo y en ciertos aspectos requiere de conocimientos conceptuales que rara vez puedes aprender en los tutoriales.
Tratando de simplificar, hay razones a favor y en contra de ambas posturas, pero el lo concreto es que termina siendo una decisión de diseño, ya que no hay reglas absolutas.

Mirados desde la óptica del modelo E-R, usar autoincrementales como ID, es un defecto, ya que lo que se postula es que una instancia de una entidad tiene por definición de su propia identidad, una clave natural, que surge de los propios atributos. Es decir, siempre existe un atributo o grupo de ellos que puede identificar unívocamente a esa instancia en todo el universo de instancias posibles.
El proceso de normalización de bases de datos sugiere que los ID numéricos se usen sólo si llegados a la 3FN no se ha encontrado una CC. Más allá de eso, no es muy convniente.

Los identificadores naturales tienen algunas ventajas:

- Son realmente únicos, lo que permite que diferentes bases con la misma entidad jamás se pisen identificadores, ya que siempre se referirán a la misma instancia (aunque los atribuitos no claves no sean los mismos).
- Las consultas principales siempre usan como parámetros precisamente aquellos atributos que son clave.
- Cuando los parámetros forman parte de las busquedas, los indices primarios definidos son un excelente recurso. Y cuando sólo se consulta por ellos, entonces se leen índices y no tablas (mejor performance).
- El uso de claves naturales permite integración de bases, migraciones y consolidaciones sin conflictos.

Como "contra", implica que requieren mejores análisis de estructura de datos, normalizaciones mas detalladas y una fuerte vigilancia respecto a la consistencia de datos en las estructuras.
En otras palabras, exigen trabajar, y mucho.
También pueden ocupar más espacio de disco, pero actualmente esto es de peso relativo (tenía más impacto cuando la relación almacenamiento/costo era mayor).

Las claves autoincrementales tienen ciertas "ventajas", casi todas a nivel de proceso:
1) Son fáciles de definir, ya que no requieren análisis profundo (y por ende tiene a descuidarse la consistencia).
2) Ocupan menos espacio.
3) Se realizan JOINS rápidos (ya que la evaluación es a nivel de binarios), y por ende pueden obtenerse mejores performances en ciertos casos.

Tienen ciertos "defectos":
- No se puede hacer integración ni consolidación de sistemas sin complejos procesos de migración de datos con validaciones muy elaboradas.
- Traen problemas en los backup históricos.
- No son suficientemente identificatorios de la misma instancia de entidad en diferentes bases, porque no hay relación entre el ID y la entidad representada.
- Obligan a parametrizaciones adicionales en las búsquedas (que en definitiva sería lo mismo que usar claves naturales).
- Facilita el incorrecto manejo de las definiciones de ID en las tablas, ya que es habitual que el rango se desperdicie en un 50% (se crean enteros con signo, cuando un ID nunca puede ser negativo).

A mi personal entender, es un método "fácil" para los programadores, porque lo entienden, pero un dolor de cabeza para los arquitectos de datos.

Se puede decir mucho más, pero creo que eso te puede dar un pantallazo.

Obviamente, no estoy a favor de los autoincrementales. Especialmente porque los veo usar mal en casi todos los casos.
__________________
¿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 07/05/2013, 08:03
 
Fecha de Ingreso: diciembre-2011
Mensajes: 134
Antigüedad: 12 años, 3 meses
Puntos: 5
Respuesta: Es conveniente definir un ID autoincrementable como clave de cada tabla?

Gracias por contestar.

Me quedo con esto.


Cita:

El tema en si, es largo, algo complejo y en ciertos aspectos requiere de conocimientos conceptuales que rara vez puedes aprender en los tutoriales.
Tratando de simplificar, hay razones a favor y en contra de ambas posturas, pero el lo concreto es que termina siendo una decisión de diseño, ya que no hay reglas absolutas.
Este parrafo me ha aclarado todas las dudas. Los puntos negativos y positivos que comentas mas o menos son los mismos que hay por mil paginas de internet ... pero eres uno de los pocos que no te posicionas rotundamente en defender una postura y eso se agradece porque asi saco la conclusion de que nunga de las dos formas de trabajar es correcta ni tampoco incorrecta, solo depende de en que y como quiera aplicarla.


Creo que me quedare trabajando con la forma tradicional cuando haga los programas a pelo y utilizare la forma de relacionar por ID cuando trabaje con framework.

Etiquetas: autoincrementable, cada, clave, definir, tabla
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 22:17.