2011-01-21 10 views

Respuesta

2

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.)

6

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:

+0

Tuve que hacer un par de consultas donde realmente me ayudó tener 'id' en mis tablas nton. – Matt

+0

@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) –

+0

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

4

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í" :-)

+1

Necesita una 'CLAVE PRIMARIA' compuesta en una tabla de relaciones 'de muchos a muchos'. – Quassnoi

+0

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

+0

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

2

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.

+0

Siempre que la clave natural sea razonablemente compacta, lo haría también. Si es un 'varchar (1000)', entonces probablemente use un sustituto. –

0

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.

0

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 !

+0

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

+0

Cuando es una LLAVE PRINCIPAL, automáticamente se indexa de todos modos –

Cuestiones relacionadas