Pour utiliser ou ne pas utiliser l'identité sur une table de search

Dans SQL Server, j'ai la table de search suivante qui contient des niveaux de degré:

create table dbo.DegreeLevel ( Id int identity not null constraint PK_DegreeLevel_Id primary key clustered (Id), Name nvarchar (80) not null constraint UQ_DegreeLevel_Name unique (Name) ) 

Devrais-je utiliser l'identité sur l' ID ?

Quand dois-je utiliser l'identité ou un simple int dans une table de search?

Je suppose que cela revient à savoir si vous avez ou non un candidat naturel à utiliser dans l'index clusterisé …

Si vous possédez déjà une propriété qui peut identifier la ligne de manière unique, il vaut la peine de considérer si l'ajout d'une colonne d'identité est le bon choix.

Si vous n'avez pas de candidat naturel, vous devez inventer une valeur et, dans ce cas, utiliser une colonne ou une séquence d'identité est probablement plus facile que de lancer quelque chose.

À titre d'exemple d'une key naturelle, imaginez une table «DegreeModule» dans laquelle chaque module a un code de reference de 4 caractères qui a été imprimé sur les supports de cours (par exemple U212)

Dans ce cas, je sauterais définitivement la création d'un identifiant interne et j'utiliserais l'identifiant naturel comme key primaire …

 create table dbo.DegreeModule ( Reference char(4) not null primary key clustered, Name nvarchar(80) not null constraint UQ_DegreeModule_Name unique (Name) /* .. plus FK's for stuff like parent degree, prerequirejsites,etc .. */ ) 

Dans une table de search , avoir un Id INT "normal" pourrait être meilleur, car il vous donne la possibilité de choisir et de choisir les valeurs Id . Vous arrivez à définir les valeurs que vous avez et ce qu'elles signifient.

Identity est très utile pour les tables de données réelles, où vous avez juste besoin de savoir que vous avez une bonne valeur d'identifiant unique – mais vous ne vous souciez pas vraiment de la valeur de cette valeur.

Lorsque vous spécifiez la propriété Identity dans une colonne entière d'une table, la colonne devient une colonne entière auto-incrémentante. Si vous souhaitez que votre table de search crée automatiquement la valeur d'identifiant lorsque vous insérez une ligne, utilisez l'identité. Si vous voulez le créer vous-même, il suffit de définir la colonne int.

  • Une table ne peut avoir qu'une seule colonne d'identité
  • Vous ne pouvez pas insert / mettre à jour manuellement des valeurs dans une colonne d'identité, sauf si vous spécifiez SET identity_insert on

Après avoir traité avec plusieurs environnements où nous passons des changements d'un environnement à l'autre, je dirais de ne pas utiliser les colonnes d'identité sur les tables de search.

Voici pourquoi: si vous avez besoin de referencer un identifiant en tant que "magic #", vous avez besoin de cohérence. Idéalement, vous ne référerez jamais un numéro de magie, mais en réalité, ce n'est pas ce qui est généralement fait. Et c'est une douleur de corriger quand les identifiants ne sont pas synchronisés. Et ce n'est vraiment pas beaucoup plus d'effort pour insert datatables de la table avec un ID.

Si vous allez utiliser un outil de mappage relationnel d'object ( ORM ), reportez-vous à sa documentation. Dans ce cas, vous souhaiterez probablement autoriser ORM à gérer la key primaire et vous ne devez pas utiliser d'identité.

Si vous n'avez aucune exigence spécifique pour la génération de key primaire, l'utilisation de l'identité ici est correcte . Les exigences spécifiques peuvent être: les keys primaires suivent un format spécial, les keys primaires doivent être globalement uniques, les keys primaires sont imscopes d'autres bases de données, par exemple en les insert into DegreeLevel values (1, 'Bachelor') etc.