Me parece que siempre es una buena idea, pero ¿hay algún caso en que sea mejor no tener esto en la mesa?¿Alguna vez es una buena idea no tener una clave principal 'id' para una tabla?
Respuesta
En mi experiencia, casi nunca. (Para "la velocidad importa, simplemente estoy insertando y realmente no me importa la recuperación en este punto", quizás sea el estilo de aplicación).
Aunque es posible que nunca uses el campo ID, es casi siempre conveniente ten felizmente un AUTO_INCREMENTAR, porque algún día podrías necesitar uno. (Por supuesto, puede simplemente hacer un 'ALTER ..' para agregar uno, pero eso es además del punto.)
Normalmente, debe tener algún tipo de PRIMARY KEY
.
Existen situaciones muy especiales cuando no lo desea, especialmente las tablas de registro organizadas en montón (no agrupadas) que no tienen índices para agilizar las inserciones.
Tenga en cuenta que en MySQL
, InnoDB
las tablas no se pueden organizar de forma organizada, por lo que esto solo se aplica a las tablas MyISAM
.
También tenga en cuenta que un PRIMARY KEY
puede ser compuesto, como en una tabla de relaciones many-to-many
. No tendrá una columna id
en dicha tabla, pero tendrá una clave primaria compuesta compuesta por las columnas id
de las tablas relacionadas.
Ver esta cuestión para más detalles:
Tuve que hacer un par de consultas donde realmente me ayudó tener 'id' en mis tablas nton. – Matt
@Matt: si ha facilitado las cosas, como es posible que aparezcan el mismo hecho varias veces, porque no está imponiendo que los valores (AID, BID) sean únicos, ¿vale la pena? Si no aplica las claves "reales", pero solo tiene estas columnas de ID, puede terminar fácilmente con duplicados en su base de datos. (Por el contrario, el único beneficio que se me ocurre tener una columna de ID en este caso es permitir identificar de manera única los duplicados cuando se intenta limpiar la base de datos) –
Un caso de ejemplo para cuando ha sido útil, se une a la tabla con sí mismo en una clave externa e identificar qué filas de resultados están duplicadas – Matt
Respuesta corta: sí.
Respuesta más larga: si tiene una tabla para usar en una relación muchos a muchos, realmente no necesita una clave principal. Entonces puede considerarse como un desperdicio de espacio. Puede haber más ejemplos, esta es solo una prueba para la respuesta "sí" :-)
Necesita una 'CLAVE PRIMARIA' compuesta en una tabla de relaciones 'de muchos a muchos'. – Quassnoi
No es exactamente 'necesario', pero seguramente hace que las cosas funcionen más rápido. También es una clave primaria natural para dicha tabla. – Mchl
Simplemente teórico: en una relación de muchos a muchos, todo lo que necesita son los ID que deben vincularse. Realmente no "necesitas" un PK. – Dirk
Tener una clave principal es una buena idea (y necesaria si desea tener un diseño de base de datos completamente normalizado).
Personalmente, si la tabla tiene una clave candidata natural la usaré la mayor parte del tiempo, en lugar de agregar una columna de ID que deba rellenarse artificialmente.
Siempre que la clave natural sea razonablemente compacta, lo haría también. Si es un 'varchar (1000)', entonces probablemente use un sustituto. –
Para el rendimiento/espacio, evito los campos de ID de autonumerador si es posible. Si tiene una tabla muy grande (muchos millones o miles de millones de registros), entonces el espacio es importante. si puede encontrar una clave principal buena y utilizable basada en otro campo (o campos), entonces es mejor utilizarla que introducir un campo ID.
No tiene sentido tener una clave principal de número automático si puede usar un conjunto de campos de los que tenga un índice exclusivo como clave principal. Solo debe tener cuidado con las ACTUALIZACIONES para mantener la integridad referencial.
Para las bases de datos de first normal form o second normal form.
Depende de su diseño de datos y de la forma en que accede a los datos en la tabla.
Una tabla de registro por lo general no necesita una clave principal, porque a menudo accede a los registros en grupos y no elimina ni edita mensajes individuales (puede purgar toda la tabla o una ventana de tiempo de registros).
Otras veces, un campo de ID podría ser redundante. Si los clientes se suscriben a su sitio web con OpenID (o simplemente una dirección de correo electrónico), entonces ya tiene su clave principal. Sin embargo, en este caso, es una buena práctica agregar el campo ID redundante, porque un entero usa menos espacio que las cadenas, y se supone que debes repetir el ID en todas las relaciones en las que está involucrada la entidad.
Finalmente, las tablas de relaciones no necesitan una identificación explícita en el 99% de los casos. Ejemplo: una relación de varios a varios entre Usuarios y Grupos. La tabla de relaciones solo consiste en ID de usuario e ID de grupo, y que es su clave principal (le gustaría indexar los dos campos por separado para el rendimiento ...).
Por cierto, la identificación de auto incremento no reduce el rendimiento significativamente. El valor del contador se almacena en los metadatos de la tabla, por lo que cuando el DBMS realiza una inserción aumenta automáticamente el contador de referencia, y esto se puede hacer con el equivalente de Java AtomicInteger
y C# Interlocked
, por lo que no tiene que preocuparse por nada !
Se debe indexar una columna 'AUTO_INCREMENT'. Es el índice que ralentiza el 'INSERT' en la tabla, no el hecho de si la columna se incrementa automáticamente de no. – Quassnoi
Cuando es una LLAVE PRINCIPAL, automáticamente se indexa de todos modos –
- 1. ¿Es una buena idea usar una columna calculada como parte de una clave principal?
- 2. Objetos de longitud variable: ¿Alguna vez una buena idea?
- 3. ¿Cuándo tener una columna de identidad no es una buena idea?
- 4. ¿Es una buena idea crear un tipo personalizado para la clave principal de cada tabla de datos?
- 5. ¿Cuándo no necesitamos una clave principal para nuestra tabla?
- 6. ¿RedBean necesita una clave principal "id"?
- 7. ¿Es una mala idea tener una tabla de propiedades en una base de datos?
- 8. es dormir() una buena idea para el bucle principal de una aplicación de trabajo de programación
- 9. Cakephp Guardar con una tabla donde la clave principal no es 'id'
- 10. ¿podemos tener una clave externa que no sea la clave principal en ninguna otra tabla?
- 11. ¿Es una buena idea tener una sintaxis de azúcar para funcionar en Python?
- 12. ¿Cuándo no es una buena idea pasar por referencia?
- 13. sqlite e hibernate - es una buena idea?
- 14. Bloquear para manejar concurrencia-- una buena idea?
- 15. ¿Alguna vez hay una buena razón para usar Insertion Sort?
- 16. ¿Es una buena idea usar varargs en una API C para establecer pares de valores clave?
- 17. cómo agregar una clave principal a una tabla en rieles
- 18. ¿Alguna vez hay una buena razón para usar eval()?
- 19. ¿Es una buena idea una clase de "preferencias maestras"?
- 20. ¿Es una buena columna para una mesa de columna?
- 21. ¿Campos multivalorados una buena idea?
- 22. ¿Es una buena idea usar una función CreateUUID() como sal?
- 23. Creando una clave principal en una tabla temporal - ¿Cuándo?
- 24. PHP MySQL Comprobar si una tabla tiene una clave principal
- 25. Cookies de sesión firmadas. ¿Una buena idea?
- 26. Implementar una clase "LazyProperty": ¿es esta una buena idea?
- 27. ¿Es una buena idea devolver "const char *" de una función?
- 28. ¿Es una buena idea comparar double.MaxValue para la igualdad?
- 29. Pregunta SQL para encontrar la clave principal de una tabla?
- 30. Django: ¿Es una buena idea generar JS dinámicamente?
Tenga en cuenta que al usar tablas InnoDB, incluso si no crea explícitamente una clave primaria, MySQL creará su propio índice oculto de 6 bytes. – Mchl
a Mchl donde la referencia a la documentación? –