Eficiencia de la clave primaria compuesta como clave externa

12

Tengo una tabla con una clave primaria compuesta (que consta de 4 columnas) que se utiliza para garantizar que no se ingresen duplicados en la tabla. Ahora necesito una nueva tabla que deberá hacer referencia a las claves de esta tabla como claves externas.

Mi pregunta es qué enfoque es más eficiente para las velocidades de búsqueda:

1) ¿Creo la nueva tabla que incluye las 4 columnas y hago referencia a todas en una clave foránea?

o

2) ¿Creo una nueva columna de identidad en la tabla de Clave primaria y la uso como clave externa en la nueva tabla?

Se espera que esta base de datos contenga una gran cantidad de datos, por lo que la he creado hasta ahora con el objetivo de minimizar la cantidad de datos que contiene cada tabla. Con esto en mente, la opción 2 sería el mejor enfoque ya que guardaré 2 columnas int y una columna de fecha y hora para cada fila, pero quiero evitar aumentar el tiempo de búsqueda si es innecesario.

aaroncatlin
fuente
1
Personalmente, casi siempre usaría una clave sustituta (por ejemplo, una INT IDENTITY) en ese caso, hace que hacer referencia y unirse a esa tabla sea muuuucho más fácil. Para evitar duplicados, ponga una restricción ÚNICA en esas cuatro columnas. Además: las claves primarias estrechas son mucho mejores por razones de rendimiento (si se usan como clave de agrupación)
marc_s

Respuestas:

11

El costo de usar un PK entero sintético simple es pequeño, y el beneficio en su caso probablemente sería bastante considerable.

  • Como señala, tendrá una relación FK mucho más simple.
  • Un PK pequeño genera índices pequeños (y rápidos). Su espacio total en la tabla probablemente se reducirá agregando una columna de este tipo.
  • Si las reglas de negocio cambian alguna vez, no tendrá que reordenar la tabla.

El único inconveniente material que viene a la mente es que puede perder rendimiento en las consultas que se beneficiaron de la agrupación en la PK compuesta. Si cree que eso puede ser significativo, continúe agrupando en la clave candidata compuesta, pero coloque el PK en la clave sintética.

Jon de todos los oficios
fuente
5

Como tantas veces en el mundo SQL, la respuesta es: "Depende".

Eche un vistazo a esta pregunta para algunos punteros: ¿Las claves naturales proporcionan un rendimiento mayor o menor en SQL Server que las claves enteras sustitutas?

Hay casos que ven una mejora en el rendimiento cuando se usan claves naturales como claves externas. Sin embargo, en la mayoría de los casos, será mejor con claves más pequeñas (léase: claves sustitutas).

Si introduce esa columna IDENTIDAD, incluso la convertiría en la Clave principal y cambiaría las columnas "naturales" para ser una RESTRICCIÓN ÚNICA.

Sebastian Meine
fuente