Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Identificateur unique (guid) comme clé primaire dans la conception de la base de données

Un GUID 128 bits (uniqueidentifier ) la clé est bien sûr 4x plus grande qu'un int 32 bits clé. Cependant, il y a quelques avantages clés :

  • Pas de problème "IDENTITY INSERT" lors de la fusion de contenu
  • Si vous utilisez une valeur COMB au lieu de NEWSEQUENTIALID(), vous obtenez un horodatage INSERT "gratuit". Vous pouvez même SELECT à partir de la clé primaire basée sur une plage de date/heure si vous le souhaitez avec quelques fantaisies CAST() appels.
  • Ils sont uniques au monde, ce qui s'avère très pratique de temps en temps.
  • Étant donné qu'il n'est pas nécessaire de suivre les repères des hautes eaux, votre couche BL peut attribuer la valeur plutôt que SQL Server, éliminant ainsi l'étape de SELECT scope_identity() pour obtenir la clé primaire après une insertion.
  • S'il est possible, même à distance, que vous ayez plus de 2 milliards d'enregistrements, vous devrez utiliser bigint (64 bits) au lieu de int . Une fois que vous avez fait cela, uniqueidentifier n'est que deux fois plus gros qu'un bigint .
  • L'utilisation de GUID permet d'exposer plus en toute sécurité les clés dans les URL, etc., sans vous exposer aux attaques "devinez l'ID".
  • Entre la façon dont SQL Server charge les pages à partir du disque et la façon dont les processeurs sont désormais principalement 64 bits, ce n'est pas parce qu'un nombre est de 128 bits au lieu de 32 que la comparaison prend 4 fois plus de temps. Le dernier test que j'ai vu a montré que les GUID sont presque aussi rapides.
  • La taille de l'index dépend de combien les colonnes sont incluses. Même si les GUID eux-mêmes sont plus grands, les 8 ou 12 octets supplémentaires peuvent être insignifiants par rapport aux autres colonnes de l'index.

En fin de compte, extraire un petit avantage de performances en utilisant des nombres entiers ne vaut peut-être pas la peine de perdre les avantages d'un GUID. Testez-le empiriquement et décidez par vous-même.

Personnellement, j'utilise toujours les deux, selon la situation, mais le facteur décisif n'a jamais vraiment été la performance dans mon cas.