web-dev-qa-db-fra.com

Pourquoi les clés principales ont-elles des noms de leur propre?

D'une vue mathématique, accordé qu'une table présente au plus une clé primaire, il semble être une décision de conception à court terme pour faire référence à des clés primaires par un nom arbitraire au lieu d'une simple propriété de table.

Par conséquent pour modifier une clé primaire de non clustered à en regroupement ou vice versa, vous devez d'abord rechercher son nom, que le déposer et enfin la lecture.

Y a-t-il un avantage dans l'utilisation de noms arbitraires que je ne vois pas ou y a-t-il un SGBD qui n'utilise pas de noms arbitraires pour les clés primaires?

Modifier 2011-02-22 (02/22/2011 Pour ceux qui ne veulent pas trier la date):

Laissez mon montrer la fonction, avec laquelle vous pouvez dériver les noms d'une clé primaire à partir de son nom de tables (à l'aide des tables de système SQL-Sever Aka Sybase AKA):

create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
    return (select k.name
    from sysobjects o 
        join sysobjects k   on k.parent_obj = o.id 
    where o.name = @tablename
    and o.type = 'U'
    and k.type = 'k')
end
go

Comme GBN indique, aucune personne aime vraiment le nom généré, lorsque vous ne fournissez pas de nom explicite:

create table example_table (
    id int primary key
)

select dbo.get_pk('example_table')  

Je viens de recevoir

PK__example___3213E83F527E2E1D

Mais pourquoi les noms de SysObjects doivent-ils être uniques. Il serait parfaitement correct d'utiliser exactement le même nom pour la table et sa clé primaire.

Cela fait de cette façon, nous n'avions pas besoin de mettre en place des conventions de nommage, ce qui pourrait être violé accidentellement.

Réponses maintenant à Marian:

  1. Je n'ai utilisé que la tâche de modifier une clusterise en une clé primaire non clusteriée comme exemple où j'ai besoin de connaître le nom réel de la PK pour pouvoir le laisser tomber.
  2. Les choses n'ont pas besoin d'avoir des noms appropriés, c'est suffisant s'ils peuvent facilement noter de manière simple. C'est la base de l'abstraction. La programmation orientée objet va de cette façon. Vous n'avez pas besoin d'utiliser des noms différents pour les propriétés similaires de différentes classes.
  3. Il est arbitraire, car c'est une propriété d'une table. Le nom de la table est tout ce dont vous avez besoin pour savoir si vous souhaitez l'utiliser.
19
bernd_k

Les clés primaires (et d'autres contraintes uniques) sont implémentées comme index et sont traitées exactement de la même manière - il n'a pas de sens du point de vue du programmeur pour avoir des chemins de code séparés pour les PC et les index (il doublerait le potentiel de bugs).

Autre que celui mentionné par des clés étrangères, une PK n'est qu'une contrainte unique qui est à son tour mise en œuvre comme un index, modifiant ainsi les propriétés d'un PK correspond à la même chose que de modifier les propriétés de tout autre index. Aussi avoir un nom explicite signifie qu'ils peuvent être mentionnés dans des indications de requête comme tout autre index.

17
David Spillett

Je ne sais pas que je comprends parfaitement la question.

Si vous aviez un index sur une table et que vous vouliez/nécessaire pour modifier l'index, n'auriez-vous pas également besoin de le changer en fonction de son nom? Je suppose que vous pourriez rechercher l'objet pour l'index et faire la mise à jour de cette façon, mais les noms ont tendance à aider les gens à comprendre logiquement quel objet ils travaillent.

Donc, peut-être que la réponse est que si vous avez une forte convention de dénomination à utiliser (c'est-à-dire nom_pk pour une clé primaire), vous seriez en mesure d'identifier facilement que vous travailliez avec la clé primaire de la table.

Je suppose que la même chose pourrait également être dit pour définir les relations FK. Je pense que l'utilisation des noms est effectuée pour une interprétation logique, car les objets eux-mêmes ont tous des objectifs distincts.

6
SQLRockstar

Je dirais que c'est un détail de mise en œuvre pour la lisibilité humaine.

Les noms de contrainte sont facultatifs (au moins SQL Server), mais j'aimerais avoir PK_MyTable pour MyTable plutôt que PK_MyTabl___16feb6d8a

5
gbn

Historiquement, les clés primaires et les clés uniques sont toutes appelées clés candidates telles qu'enseignées par Christopher J. Date.

Une clé candidate est un indice unique et peut jouer le rôle d'une clé primaire. Ainsi, toutes les clés candidates sont des clés uniques. Une clé principale est simplement la désignation de l'une des clés candidates comme moyen privilégié d'accéder aux données de la table.

À la lumière de cela, la clé principale du nom est le nom arbitraire de la clé de candidature préférée ci-joint en tant que propriété de table. Il ne peut y avoir qu'une clé primaire.

En réalité, la création de clés candidates nommées devrait suffire.

Pour modifier un index de regroupement en non clustered et de retour serait un exercice de recherche de la clé principale, qui est au plus 1 par définition. Je suppose que vous pouvez dire que disposer d'une définition clé principale est essentiellement un sentiment de nostalgie pour les puristes de la base de données. Ce sens de la pureté de la base de données aurait dû appeler des clés uniques par la clé candidate aux mots-clés au lieu de la clé unique des mots.

Cliquez ici pour voir la définition d'une clé candidate et des commentaires de C.J.Date sur elle

3
RolandoMySQLDBA

Il n'y a rien à dire que la clé principale représentera l'objet de la table. L'objet de la table est l'index en cluster, pas la clé primaire. Il n'y a rien qui dit que la clé principale doit être identique à celle de l'indice en cluster. Souvent c'est, mais ce n'est pas obligé d'être. La clé principale peut facilement être appliquée par un indice non groupé.

1
mrdenny