Claves foráneas: enlace usando una clave sustituta o natural


14

¿Existe alguna práctica recomendada para determinar si una clave externa entre tablas debe vincularse a una clave natural o una clave sustituta? La única discusión que realmente he encontrado (a menos que falte mi google-fu) es la respuesta de Jack Douglas en esta pregunta , y su razonamiento me parece sólido. Soy consciente de la discusión más allá de que las reglas cambian, pero esto sería algo que debería considerarse en cualquier situación.

La razón principal para preguntar es que tengo una aplicación heredada que hace uso de FK con claves naturales, pero hay un fuerte impulso de los desarrolladores para pasar a un OR / M (NHibernate en nuestro caso), y una bifurcación ya ha producido algunos cambios importantes, por lo que estoy buscando volver a encaminarlos utilizando la tecla natural o mover la aplicación heredada para usar teclas sustitutas para el FK. Mi instinto dice que restaure el FK original, pero honestamente no estoy seguro de si este es realmente el camino correcto a seguir.

La mayoría de nuestras tablas ya tienen una clave sustituta y una clave natural ya definidas (aunque una restricción única y PK), por lo que tener que agregar columnas adicionales no es un problema para nosotros en este aspecto. Estamos usando SQL Server 2008, pero espero que sea lo suficientemente genérico para cualquier base de datos.

Respuestas:


15

Ni SQL ni el modelo relacional se ven perturbados por claves externas que hacen referencia a una clave natural. De hecho, hacer referencia a claves naturales a menudo mejora drásticamente el rendimiento. Te sorprendería con qué frecuencia la información que necesita está completamente contenida en una clave natural; hacer referencia a esa tecla intercambia una unión por una tabla más amplia (y, en consecuencia, reduce el número de filas que puede almacenar en una página).

Por definición, la información que necesita siempre está completamente contenida en la clave natural de cada tabla de "búsqueda". (El término tabla de búsqueda es informal. En el modelo relacional, todas las tablas son solo tablas. Una tabla de códigos postales de EE. UU. Puede tener filas como esta: {AK, Alaska}, {AL, Alabama}, {AZ, Arizona} , etc. La mayoría de la gente llamaría a eso una tabla de búsqueda).

En sistemas grandes, no es inusual encontrar tablas que tengan más de una clave candidata. Tampoco es inusual que las tablas que sirven a una parte de la empresa hagan referencia a una clave candidata, y las tablas que sirven a otra parte de la empresa para hacer referencia a una clave candidata diferente. Este es uno de los puntos fuertes del modelo relacional, y es parte del modelo relacional que SQL admite bastante bien.

Te encontrarás con dos problemas cuando hagas referencia a claves naturales en tablas que también tienen una clave sustituta.

Primero, sorprenderás a la gente. Aunque generalmente presiono fuertemente por el Principio de Menos Sorpresa , esta es una situación en la que no me importa sorprender a las personas. Cuando el problema es que los desarrolladores están sorprendidos por el uso lógico de claves externas, la solución es la educación, no el rediseño.

En segundo lugar, los ORM generalmente no están diseñados en torno al modelo relacional, y a veces incorporan supuestos que no reflejan las mejores prácticas. (De hecho, a menudo parecen estar diseñados sin contar con la entrada de un profesional de la base de datos). Requerir un número de identificación en cada tabla es uno de esos supuestos. Otro supone que la aplicación ORM "posee" la base de datos. (Por lo tanto, es gratis crear, soltar y renombrar tablas y columnas).

He trabajado en un sistema de base de datos que sirvió datos a cientos de programas de aplicación escritos en al menos dos docenas de idiomas durante un período de 30 años. Esa base de datos pertenece a la empresa, no a un ORM.

Una bifurcación que introduce cambios importantes debería ser un show-stopper.

Medí el rendimiento con claves naturales y claves sustitutas en una empresa en la que solía trabajar. Hay un punto de inflexión en el que las claves sustitutas comienzan a superar a las claves naturales. (Suponiendo que no haya más esfuerzo para mantener alto el rendimiento de la clave natural, como particiones, índices parciales, índices basados ​​en funciones, espacios de tablas adicionales, uso de discos de estado sólido, etc.) Según mis estimaciones para esa compañía, alcanzarán ese punto de inflexión en alrededor de 2045. Mientras tanto, obtienen un mejor rendimiento con claves naturales.

Otras respuestas relevantes: en el esquema de base de datos confuso


5

La razón principal por la que apoyo las claves sustitutas es que las claves naturales a menudo están sujetas a cambios y eso significa que todas las tablas relacionadas deben actualizarse, lo que puede poner una gran carga en el servidor.

Además, en los 30 años que he estado utilizando una variedad de bases de datos sobre muchos temas, la verdadera clave natural a menudo es bastante rara. Las cosas supuestamente únicas (SSN) no lo son, las cosas que son únicas en un momento particular pueden volverse no únicas más tarde y algunas cosas como las direcciones de correo electrónico y los números de teléfono pueden ser únicos, pero pueden reutilizarse para diferentes personas más adelante. fecha. Por supuesto, algunas cosas simplemente no tienen un buen identificador único como nombres de personas y corporaciones.

En cuanto a evitar uniones mediante el uso de una clave natural. Sí, eso puede acelerar las declaraciones de selección que no necesitan las uniones, pero hará que los lugares donde aún necesita las uniones sean más lentos ya que las uniones int son generalmente más rápidas. Probablemente también ralentizará las inserciones y eliminaciones y causará problemas de rendimiento en las actualizaciones cuando cambie la clave. Las consultas complejas (que de todos modos son más lentas) serán aún más lentas. Por lo tanto, las consultas simples son más rápidas, pero los informes y las consultas complejas y muchas acciones contra la base de datos pueden ser más lentas. Es un acto de equilibrio, que puede inclinarse de una forma u otra dependiendo de cómo se consulte su base de datos.

Por lo tanto, no hay una respuesta única para todos. Depende de su base de datos y cómo se consultará y qué tipo de información se almacena en ella. Es posible que deba realizar algunas pruebas para descubrir qué funciona mejor en su propio entorno.


1
"... las claves naturales a menudo están sujetas a cambios ...", ¡entonces no son claves muy buenas! Si un atributo cambia con frecuencia, no lo utilice como clave (para varias definiciones de "a menudo", por supuesto). Fabian Pascal argumentó que hay cuatro criterios para elegir una clave: familiaridad, irreductibilidad, estabilidad y simplicidad. A veces los intercambia por la simplicidad de una clave sustituta. Como dijo HLGEM, "Entonces, no hay una respuesta única para todos".
Greenstone Walker

1
@GreenstoneWalker, estaría de acuerdo en que no debería elegirlo como clave, pero a menudo no tiene una clave que se ajuste a los cuatro criterios y tiene que ir con lo que es único. Y cuando la unicidad es una clave copsita, entonces el problema puede ser aún mayor en términos de rendimiento cuando debe tener las uniones.
HLGEM

-4

Si no sabe la respuesta, vaya con el sustituto. He aquí por qué: si se hacen suposiciones sobre las reglas de negocios, y esas suposiciones son falsas o las reglas cambian, sus datos son basura. Aquí hay un ejemplo:

Persona, Rol, Persona Rol

La regla comercial actual establece que una Persona tiene un Rol. Cree una tabla que vincule Person y Role donde PersonRole (PersonName, PersonBirthDate, PersonMotherMaidenName, ..., RoleCode)

¡Ahora eres un verdadero purista cuando se trata de Natural Keys! Pero en serio, ¿qué pasa si la organización decide que una persona ahora puede asumir múltiples roles? ¿Cuáles son los efectos posteriores de apoyar el cambio en las necesidades comerciales?


2
¿Y no tienes estos problemas con las claves sustitutas? Por favor muéstranos cómo.
Colin 't Hart

44
El ejemplo dado no parece demostrar nada relevante para la discusión.
mustaccio
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.