Pregunta de layout de la database relacional: ¿key sustituta o key natural?

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

a) Tipo de tabla, sustituto / key artificial

La key externa es de user.type a type.id : texto alternativo

b) Tipo de tabla, key natural

La key externa es de user.type a type.typeName : texto alternativo

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

Las siguientes son las principales desventajas del enfoque key 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 key 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 key natural única , y esto es necesario, ya que se utilizará como key principal. Esto podría no aplicarse en su caso.

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

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

Prefiero usar la key sustituta. A menudo las personas identificarán y usarán la key natural que estará bien por un time, 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 key natural, probablemente sea la opción preferible, ya que no requerirá una unión para get el valor.

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

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 key principal que era una buena idea. No hace falta decir que cuando las personas querían cambiar sus direcciones realmente apestaba.

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 devise una key sintética. Si está creando una database 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 keys naturales que funcionan para las cosas importantes. Para las cosas sin importancia, adaptarse a ti mismo.

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

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

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

como la estructura de la table.

ahora considero que quiero hacer un seguimiento en muchas tablas como quién está insertando loggings … si utilizo Id como key principal, entonces [1,2,3,4,5..] etc. estarán en tablas extranjeras y cada vez que necesito saber quién está insertando datos, debo unirme a User Table con él porque 1,2,3,4,5,6 tiene sentido. pero si utilizo UserId como una key primaria que está identificada de forma única, entonces se saveá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 indexing tiene un importante problema de performance donde int se comporta mejor que varchar

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

Es útil porque la key 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.