web-dev-qa-db-fra.com

Pourquoi utiliser une intégration de la clé principale d'une table de recherche?

Je veux savoir pourquoi je devrais utiliser une touche principale de Int comme une table de recherche au lieu d'utiliser simplement la valeur de la recherche comme clé principale (qui serait dans la plupart des cas une chaîne).

Je comprends que l'utilisation d'un Nvarchars (50) plutôt que d'une INT utiliserait une manière plus d'espace si elle est liée à une table avec de nombreux enregistrements.

D'autre part, utiliser la valeur de la recherche directement, nous économiserions essentiellement faire une jointure. Je peux imaginer que ce serait une grande sauvegarde si la jointure est toujours requise (nous travaillons sur une application Web afin que cela compte un peu).

Quels sont les avantages de l'utilisation d'une clé primaire INT (spécifiquement pour une table de recherche) autre que "la chose standard à faire"?

30
Jaco Briers

La réponse à votre question est logique et non physique - la valeur que vous recherchez pourrait changer pour des raisons commerciales. Par exemple, si vous indexez vos clients par adresse électronique, que se passe-t-il lorsqu'une adresse électronique change? Évidemment, cela ne s'appliquera pas à toutes vos tables de recherche, mais les avantages de le faire de la même manière sur l'ensemble de l'application sont qu'il rend votre code plus simple. Si tout est entier → Relations entières en interne, vous êtes couvert.

Il suffit de lire votre commentaire à Sandy - peut-être dans ce cas ce que vous voulez vraiment est une contrainte de contrôle , pas une table de clé étrangère/de recherche, par exemple:

create table icecream (flavour varchar(10))
go
alter table icecream add constraint ck_flavour check (flavour in ('Orange', 'Pista', 'Mango'))
go
insert into icecream (flavour) values ('Orange')
go
insert into icecream (flavour) values ('Vanilla')
go

Exécutez ceci et vous obtenez:

(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_flavour". The conflict occurred in database "GAIUSDB", table "dbo.icecream", column 'flavour'.
The statement has been terminated.

Il s'agit d'une méthode efficace et performante, mais l'inconvénient est bien sûr que l'ajout d'une nouvelle saveur signifie un changement de code. Je conseillerais de le faire dans la demande - car alors vous devez le faire dans chaque application qui se connecte à cette dB, c'est la conception la plus propre possible car il n'y a qu'un seul chemin de code pour la validation.

23
Gaius

"Utilisation de la valeur de la recherche directement" - son bit contradictoire avec le but réel de la table de recherche. Pourquoi vous gardez une telle table? Si ce n'est pas une recherche.
[.____] Peut-être que j'ai mal compris votre question. Voici une définition de table de recherche de msdn

Une table de recherche est utilisée pour afficher des informations d'une table en fonction de la valeur d'un champ de clé de l'étranger dans une autre table. Par exemple, envisagez un tableau des commandes dans une base de données des ventes. Chaque enregistrement dans le tableau des commandes comprend un CustomerID indiquant lequel le client a placé la commande. Le CustomerID est une clé étrangère pointant vers un enregistrement client dans la table des clients. Lors de la présentation d'une liste de commandes (à partir de la table des commandes), vous souhaiterez peut-être afficher le nom actuel des clients, par opposition au CustomerID. Étant donné que le nom de la clientèle est dans la table des clients et que vous présentez des données de la table des commandes, vous devez créer une table de recherche, qui prend la valeur de la clientèle dans l'enregistrement des commandes et utilise cette valeur pour naviguer dans la relation et renvoyer plus Lisible, nom du client. Ce concept est connu comme une table de recherche.

Pouvez-vous élobiner le but de votre table de recherche? Est-il utilisé pour stocker des données statiques comme ci-après et ces enregistrements ne sont pas une entrée d'autres enregistrements de tables?

Table de la saveur

Orange  
Pista  
Mango

Si ci-dessus est votre situation, je voudrais recommande de ne pas utiliser la table de recherche; Probablement Hardcode ces valeurs de liste dans votre application Web. De cette façon, vous pouvez éviter une interrogation inutile de la base de données.

7
CoderHawk

Lorsque vous définissez une pièce d'identité, vous pouvez également garantir l'unicité. Mais lorsque vous prenez, par exemple un e-mail, comme identifiant unique, vous déplacez la responsabilité de l'unicité du 3ème côté non carrété.

2
Vojta Rylko