Je suis au milieu d'un débat sur la question de savoir s'il est préférable de créer une PRIMARY KEY
colonne d' identité , ou une UDF qui génère explicitement un identifiant unique.
- Je plaide pour la colonne d'identité.
- Mon partenaire plaide pour la génération manuelle des valeurs, affirme-t-il
- en mettant l'UDF sur une autre table où nous pouvons avoir un UDF
- verrouiller la ressource
- incrémenter une table ID avec un champ appelé
ID_Value
par1
- l'utiliser comme identifiant unique global
- Ou demandez à la table de faire un
id+1
lors de l'insertion - Qu'il est plus simple de déplacer des données entre des serveurs et / ou des environnements n'ayant pas la contrainte d'identification; passer d'une base de données contenant des données à une autre base de données similaire avec, par exemple, des données intermédiaires ou factices. Pour les tests en dehors de la production, nous souhaitons peut-être retirer tous les enregistrements d'hier jusqu'à la mise en scène pour les tests.
- en mettant l'UDF sur une autre table où nous pouvons avoir un UDF
Quelle mise en œuvre est la plus logique?
La colonne d'identité me semble bien. Je ne suis pas sûr de suivre la logique expliquant pourquoi il est difficile de déplacer des données entre les serveurs.
Si vous voulez que chaque ligne ait une identité globale unique, vous pouvez utiliser un UUID mais je ne le ferais pas à moins que vous ne soyez sûr que l'unicité globale est nécessaire - généralement ce n'est pas le cas. L'utilisation des UUID comme identifiants diminuera les performances, augmentera l'espace disque requis et rendra le débogage plus difficile - en raison de la longueur, il est difficile de se souvenir d'un UUID, de le dire à quelqu'un par téléphone ou de l'écrire sur papier sans erreur.
la source
Pour les identifiants numériques simples, choisissez simplement l'identité et oubliez tous les problèmes liés à leur génération manuelle.
Vous pouvez toujours créer une "super table" qui utilise une identité comme PK et avoir une colonne de type et toute autre information. Lorsque vous avez besoin d'un nouvel ID (en supposant que vous voulez dire un IDS unique sur différentes tables), insérez simplement dans cette table et saisissez
SCOPE_IDENTITY()
puis insérez dans la table réelle dont vous avez besoin.Fondamentalement, vous créez une table: MasterID avec une identité PK, lorsque vous devez insérer une ligne dans votre Table1,
INSERT INTO MasterIDs
et obtenir l'identité générée par cette ligne à l'aideSCOPE_IDENTITY()
, puis insérer dans Table1 en utilisant cette valeur comme PK.Table1 aura un PK int non-identité. Vous feriez le même processus pour insérer dans Table2, etc. Laissez SQL Server gérer les valeurs d'identité dans la table MasterIDs , que vous pouvez ensuite utiliser dans vos autres tables. Les MasterID peuvent contenir d'autres tables, comme le type (vous pouvez donc savoir quelle table, Table1 ou Table2, etc., utilise cette valeur d'identité.
la source
Tant que vous utilisez correctement les contraintes de clé étrangère (cascade, mise à jour, etc.), vous pourrez utiliser un champ d'identité. Je ne vois vraiment aucun avantage à l'autre solution dans ce cas.
la source
L'identité a été faite pour s'adapter à votre scénario. Vous disposez d'outils tels que la réplication pour l'échange de données serveur / environnements qui permettent de tout garder ensemble.
la source
Je viens de terminer un travail où j'ai remplacé une
identity
colonne SQL Server par unint
champ normal et contrôlé l'allocation des ID moi-même.J'ai vu des gains de performances assez impressionnants. Contrairement à l'OP, je n'ai pas d'UDF pour générer l'identifiant. Mais le principe est à peu près le même: il y a une partie du logiciel qui maintient un pool d'identifiants. Lorsqu'ils sont épuisés, il obtient un autre lot en interrogeant la base de données pour la prochaine valeur Low et l'incrémente au prochain High .
Cela nous permet de générer des identifiants et de relier toutes les entités en dehors d'une transaction dans notre ORM avant de soumettre les lots à la base de données et de soumettre également des lots plus importants sans aller-retour supplémentaires pour obtenir l'identité juste insérée (requis par les colonnes d'identité).
Dans la table id que nous avons, il y a plus d'une ligne, ce qui nous permet d'utiliser des plages spécifiques si nous le souhaitons. c'est-à-dire pour réutiliser des blocs supprimés et des identifiants négatifs.
la source
J'utilise l'identité depuis des années et envisage sérieusement de remplacer le numéro d'identité par UNIQUEIDENTIFIER. C'est un cauchemar lorsque vous devez modifier le type de données si quelqu'un l'a conçu pour être une base de données compacte et un cauchemar si vous devez ajouter une identité à une colonne, vous ne pouvez pas non plus mettre à jour la colonne d'identité. Imaginez que vous mettez un entier et que votre base de données dépasse les 2 milliards d'enregistrements, encore une fois cauchemar pour changer (pensez aux FK)! Changer quoi que ce soit avec l'identité est un cauchemar et n'est pas à l'échelle, sauf si vous mettez bigint! UNIQUEIDENTIFIER vs Identity = commodité et robustesse vs amélioration des performances peut-être perceptible (n'a pas fait le benchmark).
Mise à jour: Après avoir vu cela, je penche définitivement vers UNIQUEIDENTIFIER. Cela ne montre aucun avantage réel de l'identité bigint et un tas d'avantages pour UNIQUEIDENTIFIER! Différentes versions de SQL Server peuvent avoir un résultat différent. Il y a simplement de la beauté à avoir un identifiant unique dans toutes les bases de données et tous les systèmes (robustesse)! Déplacez, copiez, transformez les données à votre guise! https://www.mssqltips.com/sqlservertip/5105/sql-server-performance-comparison-int-versus-guid/
la source