Efficacité de la clé primaire composite en tant que clé étrangère

12

J'ai une table avec une clé primaire composite (composée de 4 colonnes) qui est utilisée pour garantir qu'aucun doublon n'est entré dans la table. J'ai maintenant besoin d'une nouvelle table qui devra référencer les clés de cette table en tant que clés étrangères.

Ma question est de savoir quelle approche est la plus efficace pour les vitesses de recherche:

1) Dois-je créer la nouvelle table comprenant les 4 colonnes et les référencer toutes dans une clé étrangère.

ou

2) Dois-je créer une nouvelle colonne d'identité dans la table de clé primaire et l'utiliser comme clé étrangère dans la nouvelle table.

Cette base de données devrait contenir une très grande quantité de données, donc je l'ai construite jusqu'à présent en vue de minimiser la quantité de données contenues dans chaque table. Dans cet esprit, l'option 2 serait la meilleure approche car j'enregistrerai 2 colonnes int et une colonne datetime pour chaque ligne, mais je veux éviter d'augmenter le temps de recherche si cela n'est pas nécessaire.

aaroncatlin
la source
1
Personnellement, j'utiliserais presque toujours une clé de substitution (par exemple un INT IDENTITY) dans un tel cas - rend le référencement et la jonction de cette table tellement plus faciles. Pour éviter les doublons, placez une contrainte UNIQUE sur ces quatre colonnes. Aussi: les clés primaires étroites sont bien meilleures pour des raisons de performances (si elles sont utilisées comme clé de cluster)
marc_s

Réponses:

11

Le coût d'utilisation d'un PK entier synthétique simple est faible, et l'avantage dans votre cas serait probablement assez considérable.

  • Comme vous le faites remarquer, vous aurez une relation FK beaucoup plus simple.
  • Un petit PK donne de petits indices (et rapides). Votre espace total de table sera probablement réduit en ajoutant une telle colonne.
  • Si les règles métier changent, vous n'aurez pas à réorganiser la table.

Le seul inconvénient matériel qui me vient à l'esprit est que vous pouvez perdre des performances sur les requêtes qui ont bénéficié du clustering sur le PK composite. Si vous pensez que cela est susceptible d'être important, continuez le clustering sur la clé candidate composite, mais mettez le PK sur la clé synthétique.

Jon de tous les métiers
la source
5

Comme si souvent dans le monde SQL, la réponse est: "Cela dépend".

Jetez un œil à cette question pour certains pointeurs: les clés naturelles fournissent-elles des performances supérieures ou inférieures dans SQL Server par rapport aux clés de substitution?

Il existe des cas qui constatent une amélioration des performances lors de l'utilisation de clés naturelles comme clés étrangères. Cependant, dans la plupart des cas, vous allez être meilleur avec des clés plus petites (lire: clés de substitution).

Si vous introduisez cette colonne IDENTITY, j'en ferais même la clé primaire et changerais les colonnes "naturelles" pour qu'elles soient une CONTRAINTE UNIQUE à la place.

Sebastian Meine
la source