database - étrangère - Est-ce que chaque table devrait avoir une clé primaire?




phpmyadmin clé primaire (9)

À l'exception de quelques cas très rares (peut-être une table de relations many-to-many, ou une table que vous utilisez temporairement pour charger d'énormes quantités de données), je dirais:

S'il n'a pas de clé primaire, ce n'est pas une table!

Marc

Je crée une table de base de données et je n'ai pas de clé primaire logique qui lui est assignée. Donc, je pense à le laisser sans clé primaire, mais je suis un peu coupable à ce sujet. Devrais-je?

Est-ce que chaque table devrait avoir une clé primaire?

EDIT: D'accord, d'accord ... J'ai créé la clé primaire! Es-tu content maintenant? :)


Aurez-vous besoin de joindre cette table à d'autres tables? Avez-vous besoin d'un moyen d'identifier de manière unique un enregistrement? Si la réponse est oui, vous avez besoin d'une clé primaire. Supposons que vos données sont quelque chose comme une table client qui a les noms des personnes qui sont des clients. Il n'y a peut-être pas de clé naturelle car vous avez besoin des adresses, courriels, numéros de téléphone, etc. pour déterminer si Sally Smith est différente de celle de Sally Smith et si vous stockez cette information dans des tables connexes, la personne peut avoir plusieurs téléphones. , les courriels, etc. Supposons que Sally Smith épouse John Jones et devienne Sally Jones. Si vous n'avez pas de clé artificielle sur la table, quand vous mettez à jour le nom, vous avez simplement changé 7 Sally Smiths en Sally Jones même si une seule d'entre elles s'est mariée et a changé de nom. Et bien sûr, dans ce cas, sans une clé artificielle, comment savez-vous quelle Sally Smith vit à Chicago et laquelle vit à Los Angeles?

Vous dites que vous n'avez pas de clé naturelle, donc vous n'avez aucune combinaison de champs pour rendre unique non plus, cela rend la clé artistique critique.

J'ai trouvé chaque fois que je n'ai pas de clé naturelle, une clé artificielle est un must absolu pour maintenir l'intégrité des données. Si vous avez une clé naturelle, vous pouvez l'utiliser comme champ clé à la place. Mais personnellement, à moins que la clé naturelle ne soit un champ, je préfère toujours une clé artificielle et un index unique sur la clé naturelle. Vous le regretterez plus tard si vous n'en mettez pas.


En bref, non. Cependant, vous devez garder à l'esprit que certaines opérations CRUD d'accès client l'exigent. Pour l'épreuvage futur, j'ai tendance à toujours utiliser les clés primaires.


Il suffit de l'ajouter, vous serez désolé plus tard quand vous n'avez pas (sélection, suppression, lien, etc)


Je sais que pour utiliser certaines fonctionnalités de gridview dans .NET, vous avez besoin d'une clé primaire pour que la gridview sache quelle ligne doit être mise à jour / supprimée. La pratique générale devrait être d'avoir une clé primaire ou un cluster de clé primaire. Personnellement, je préfère l'ancien.


Je suis dans le rôle de maintien de l'application créée par l'équipe de développement offshore. Maintenant, j'ai toutes sortes de problèmes dans l'application parce que le schéma de base de données d'origine ne contenait pas les clés primaires sur certaines tables. Alors, s'il vous plaît, ne laissez pas les autres souffrir à cause de votre mauvaise conception. C'est toujours une bonne idée d'avoir des clés primaires sur les tables.


Presque chaque fois que j'ai créé une table sans clé primaire, pensant que je n'en aurais pas besoin, j'ai fini par revenir en arrière et en ajouter un. Je crée maintenant même mes tables de jointure avec un champ d'identité généré automatiquement que j'utilise comme clé primaire.


Réponse courte: oui

Longue réponse:

  • Vous avez besoin de votre table pour être joignable sur quelque chose
  • Si vous souhaitez que votre table soit mise en cluster, vous avez besoin d'une sorte de clé primaire.
  • Si votre conception de table n'a pas besoin d'une clé primaire, repensez votre conception: très probablement, il vous manque quelque chose. Pourquoi garder des enregistrements identiques?

Dans MySQL, le moteur de stockage InnoDB crée toujours une clé primaire si vous ne l'avez pas spécifiée explicitement, créant ainsi une colonne supplémentaire à laquelle vous n'avez pas accès.

Notez qu'une clé primaire peut être composite.

Si vous avez une table de liens many-to-many, vous créez la clé primaire sur tous les champs impliqués dans le lien. Ainsi, vous vous assurez que vous n'avez pas deux ou plusieurs enregistrements décrivant un lien.

Outre les problèmes de cohérence logique, la plupart des moteurs de SGBDR bénéficieront d'inclure ces champs dans un index unique.

Et puisque toute clé primaire implique la création d'un index unique, vous devez le déclarer et obtenir à la fois la cohérence logique et les performances.

Voir cet article dans mon blog pour savoir pourquoi vous devriez toujours créer un index unique sur des données uniques:

PS Il y a des cas très, très spéciaux où vous n'avez pas besoin d'une clé primaire.

Généralement, ils incluent des tables de journaux qui n'ont aucun index pour des raisons de performances.


Si vous utilisez Hibernate, il n'est pas possible de créer une entité sans clé primaire. Ces problèmes peuvent créer un problème si vous travaillez avec une base de données existante qui a été créée avec des scripts sql / ddl simples et qu'aucune clé primaire n'a été ajoutée





database-design