una tipos secundaria relacion que primaria natural modelo llave foranea entidad ejemplo datos compuesta claves clave sql database-design data-modeling surrogate-key natural-key

sql - tipos - que es una llave foranea en base de datos



Pregunta de diseño de la base de datos relacional: ¿clave sustituta o clave natural? (10)

¿Cuál es la mejor práctica y por qué ?

a) Tipo de tabla, sustituto / clave artificial

La clave externa es de user.type a type.id :

b) Tipo de tabla, clave natural

La clave externa es de user.type a type.typeName :


Clave sustituta para mí también, por favor.

El otro podría ser más fácil cuando necesite extraer algún código, pero eventualmente será más difícil. De vuelta en el día, mi jefe de tecnología decidió usar una dirección de correo electrónico como una clave principal que era una buena idea. No hace falta decir que cuando las personas querían cambiar sus direcciones realmente apestaba.


Creo que en la práctica, usar una llave natural rara vez es la mejor opción. Probablemente apostaría por el enfoque clave sustituto como en su primer ejemplo.

Las siguientes son las principales desventajas del enfoque clave natural:

  • Es posible que tenga un nombre de tipo incorrecto o simplemente desee cambiar el nombre del tipo. Para editarlo, debería actualizar todas las tablas que lo usarían como clave externa.

  • Un índice en un campo int será mucho más compacto que uno en un campo varchar .

  • En algunos casos, puede ser difícil tener una clave natural única , y esto es necesario, ya que se utilizará como clave principal. Esto podría no aplicarse en su caso.


El primero es más a prueba de futuro, porque le permite cambiar la cadena que representa el tipo sin actualizar la tabla de usuario completa. En otras palabras, utiliza una clave sustituta , un identificador inmutable adicional introducido en aras de la flexibilidad.


Prefiero usar la clave sustituta. A menudo las personas identificarán y usarán la clave natural que estará bien por un tiempo, hasta que decidan que quieren cambiar el valor. Entonces los problemas comienzan.


Probablemente siempre deberías usar un número de ID (de esa manera si cambias el nombre del tipo, no necesitas actualizar la tabla del usuario) también te permite mantener el datasize abajo, ya que una tabla llena de INT es mucho más pequeña que una lleno de varcharrs de 45 caracteres.


Si typeName es una clave natural, probablemente sea la opción preferible, ya que no requerirá una unión para obtener el valor.

Solo debería usar una clave sustituta (id) cuando es probable que el nombre cambie.


Una buena razón para usar una clave sustituta (en lugar de una clave natural como el nombre) es cuando la clave natural no es realmente una buena opción en términos de exclusividad. En mi vida, he conocido no menos de 4 "Chris Smith" s. Los nombres de las personas no son únicos.


Use llaves naturales cada vez que trabajen. Los nombres usualmente no funcionan. Ellos son muy mutables.

Si está inventando sus propios datos, también podría inventar una clave sintética. Si está creando una base de datos de datos proporcionados por otras personas o su software, analice los datos de origen para ver cómo identifican las cosas que necesitan identificación.

Si están administrando bien los datos, tendrán claves naturales que funcionan para las cosas importantes. Para las cosas sin importancia, adaptarse a ti mismo.


bueno, creo que la clave surrgote es útil cuando no tiene una clave identificada de forma única cuyo valor esté relacionado y tenga sentido, ya que es su clave principal ... además, la clave de surrgote es más fácil de implementar y menos costosa de mantener.

pero, por otro lado, la clave surrgote a veces tiene un costo adicional al unir mesas. pensar en ''Usuario'' ... tengo

UserId varchar(20), ID int, Name varchar(200)

como la estructura de la mesa.

ahora considero que quiero hacer un seguimiento en muchas tablas como quién está insertando registros ... si utilizo Id como clave principal, entonces [1,2,3,4,5..] etc. estará en tablas extranjeras y cada vez que necesito saber quién está insertando datos, me tengo que unir a User Table con él porque 1,2,3,4,5,6 tiene sentido. pero si utilizo UserId como una clave primaria que está identificada de forma única, entonces se guardarán en otras tablas foráneas [john, annie, nadia, linda123] etc., lo que a veces es fácilmente distinguible y significativo. así que no necesito unirme a la tabla de usuarios cada vez que pregunto.

pero obsérvenlo, se necesita un poco de espacio físico adicional ya que varchar se guarda en tablas extrañas, lo que requiere bytes adicionales ... y, por supuesto, la indexación tiene un importante problema de rendimiento donde int se comporta mejor que varchar


La clave sustituta es una sustitución de la clave primaria natural. Es solo un identificador único o número para cada fila que se puede usar para la clave principal de la tabla. El único requisito para una clave primaria sustituta es que sea única para cada fila de la tabla.

Es útil porque la clave primaria natural (es decir, el número de cliente en la tabla de clientes) puede cambiar y esto hace que las actualizaciones sean más difíciles.