Entiendo un beneficio de las claves sustitutas / artificiales en general: no cambian y eso puede ser muy conveniente. Esto es cierto si son de campo único o múltiple, siempre que sean 'artificiales'.
Sin embargo, a veces parece ser una cuestión de política tener un campo entero de incremento automático como clave principal de cada tabla. ¿Es esta siempre la mejor idea tener una clave de campo único y por qué (o por qué no)?
Para ser claros, esta pregunta no se trata de artificial versus natural, sino de si todas las claves artificiales deben ser de campo único
database-design
primary-key
surrogate-key
Jack Douglas
fuente
fuente
Respuestas:
Voy a decir que no, no siempre, pero la mayoría de las veces sí. .
Estas son algunas circunstancias en las que no necesita un sustituto o una clave artificial:
tabla de búsqueda con una clave comercial única que se fija externamente a su
negocio y que tiene cero posibilidades de cambiar para cualquier
propósito práctico, entonces usar la clave comercial directamente puede simplificar las
cosas. Un ejemplo podría ser una lista de
códigos de estado o provincia o una lista de números estándar ANSI, etc.
También hay algunas situaciones en las que la clave sustituta de números enteros crecientes monotónicamente fieles no es ideal. Puede tener claves que sean sustitutos alfanuméricos. Estos podrían incluir:
¿Por qué la mayoría de las veces sí? La respuesta más fundamental a esa pregunta es que es un verdadero infierno si alguna vez necesita modificar un valor de clave primaria en cualquier tabla. Dado que casi cualquier cosa que un usuario pueda ver o tocar está posiblemente sujeto a una actualización en algún momento, el uso de un valor de clave visible es un verdadero infierno. Usar una llave sustituta evitará que caigas en esta trampa.
Dicho esto, recuerde que hay espacio para YAGNI en la aplicación de este concepto. No necesita forzar tablas de códigos con claves de IDENTIDAD en cada rincón de su esquema, en caso de que alguien decida que el símbolo del género masculino en su tabla de empleados debe cambiar de M a X o algo tonto.
fuente
No.
Diría que ciertamente hay casos en que las claves de campo único son inferiores a las claves compuestas, al menos para el propósito de claves externas . Eso no quiere decir que no debería tener una clave sustituta de un solo campo también si lo prefiere, pero personalmente prefiero que la clave que se usa con más frecuencia como destino de una clave externa se llame clave primaria
Intentaré ilustrar mi punto en los siguientes ejemplos, en los que:
brand
es la marca del automóvil, por ejemplo, Ford, Toyota, etc.dealer
es un concesionario físico, vinculado a una marca (por ejemplo, un concesionario Ford que solo vende Ford)model
es el tipo de automóvil, por ejemplo, Ford Focus, Ford Fiesta, etc.stock
es el recuento actual de automóviles en la explanada de cada concesionarioSi creamos una clave sustituta de campo único para
dealer
y de lamodel
siguiente manera:entonces es posible insertar una fila
stock
que vincule un Forddealer
con un modelo "Toyota". Agregarbrand_id references brand
astock
solo empeora el problema. Por otro lado, si mantenemos la clave externa como parte de la clave primaria de la siguiente manera:ahora la regla de que los concesionarios "Ford" solo pueden almacenar autos "Ford" se aplica naturalmente por el modelo.
Tenga en cuenta que en el ejemplo de 'claves compuestas',
dealer_id
puede o no ser único, de acuerdo con las preferencias. No necesita ser único (es decir, una clave alternativa), pero se pierde muy poco al hacerlo (tal vez un poco de espacio de almacenamiento) y puede ser muy útil, por lo que esa es la forma en que generalmente lo configuro, por ejemplo:fuente
"depende"
Sí: los campos IDENTIDAD / AUTONÚMERO sustituto son válidos cuando la clave natural es amplia y no numérica. Nota: esto supone la combinación de "PK" e índice agrupado que ocurre de manera predeterminada en SQL Server y Sybase, etc.
No: muchas / muchas tablas cuando las 2 claves principales son suficientes. O cuando la clave natural es corta y de longitud fija, por ejemplo, código de moneda
Por supuesto, un ORM de muerte cerebral (léase: (n) Hibernate) puede superar estas reglas ...
Editar: leer la pregunta nuevamente
Una tabla muchos / muchos con 2 claves principales sustitutas tendrá una PK de varias columnas.
Sin embargo, no necesita otra columna sustituta.
Si una tabla tiene una clave sustituta (IDENTIDAD, etc.), entonces no necesita ser una columna múltiple.
Puede tener una súper clave que incluya el sustituto, pero esto sería para imponer otras reglas (por ejemplo, subtipos )
fuente