2009-02-10 5 views
5

En règle générale, est-il préférable d'utiliser des clés primaires natives (c'est-à-dire des colonnes existantes ou une combinaison de colonnes) ou de définir votre clé primaire sur une ligne générant automatiquement des entiers?Clé primaire native ou générée automatiquement?

EDIT:
Il a été signalé pour moi que cette très semblable à this question. Le consensus ici est d'utiliser des clés de substitution, ce qui était mon inclination naturelle, mais mon patron m'a dit que je devrais aussi utiliser des clés naturelles si possible. Son conseil peut être le meilleur pour cette application particulière, car Name in row l'identifie de manière unique et nous avons besoin de maintenir la possibilité de voir les anciennes données, donc toute modification du nom/règle va signifier une nouvelle ligne unique.

Alors que les réponses ici sont toutes utiles, la plupart d'entre elles sont basées sur le subjectif "voici ce que vous devriez", et ne citent pas les sources de soutien. Ai-je manqué certaines lectures essentielles ou la conception de la base de données des meilleures pratiques est-elle hautement subjective et/ou dépendante de l'application?

Répondre

4
+0

Merci, j'ai fait plusieurs recherches avant de poser cette question, j'ai regardé les tags etc, mais je n'ai découvert aucun de ceux-ci. –

+2

Ouais la recherche SO est ... pas génial. Vous avez besoin de savoir quoi chercher ou faire ce que je fais souvent et tapez ceci dans google: site: termes de recherche stackoverflow.com – cletus

1

Quoi que ce soit, faites en sorte qu'il ne soit pas significatif (clé de substitution). Les clés primaires significatives sont mortelles.

+0

Pourriez-vous expliquer davantage? Que voulez-vous dire par "significatif"? –

+0

Je pense que l'e-mail peut être traité comme une clé primaire "significative" – Valentin

+0

Signification - exemple typique: SSN. Les clés ne doivent avoir aucune signification commerciale intrinsèque. –

0

Je dirais que la génération automatique, theres aucune raison réelle de ne pas dans mon esprit. Sauf si vous développez une sorte de table de hachage, mais quand même, je m'en tiendrai à une clé primaire unique créée automatiquement par la base de données. C'est rapide, simple et fiable. Ne réinventez pas la roue si elle est déjà là.

+0

Aucune idée pourquoi vous avez réduit, donc je l'ai contré même si votre réponse est la répétition. –

1

C'est une vieille guerre entre les puristes et les pragmatiques. Les puristes n'acceptent pas les clés primaires de substitution et insistent pour n'utiliser que des clés naturelles. Si vous me le demandez, je voterai pour l'incrément (clés de substitution) dans la plupart des situations.

8

Une clé primaire

  1. doit identifier une ligne unique.
  2. ne doit pas contenir des données, ou il changera lorsque vos modifications de données (ce qui est mauvais)
  3. devrait être rapide pour comparer les opérations (clauses WHERE/joint)

, vous utilisez idéalement un artificielle (substitut) pour vos lignes, un type de données entier numérique (INT) est préférable, car peu encombrant et rapide.

Une clé primaire devrait être faite du nombre minimum de champs pour remplir encore les conditions 1.-3. Pour la grande majorité des tableaux, ce minimum est: 1 champ.

Pour les tables de relation (ou très cas spéciaux), il peut être plus élevé. Le référencement d'une table avec une clé primaire composite est fastidieux, donc une clé composite n'est pas recommandée pour une table qui doit être référencée par elle-même.

Dans les tables de relations (relations m: n), vous créez une clé composite à partir des clés primaires des tables liées, par conséquent votre clé composite remplit automatiquement les trois conditions ci-dessus.

Vous pourrait faire des clés primaires de données si vous êtes absolument sûr , qu'il sera unique et ne changera jamais. Comme c'est difficile à garantir, je le recommande.

+0

Comment pouvez-vous créer une clé primaire native si elle ne contient aucune donnée? –

+0

@nemo: Vous créez une clé artificielle: un nombre ou un GUID. Les données sont la charge utile d'enregistrement, je ne compte pas l'ID comme données. – Tomalak

+0

Juste un point de correction - les clés de substitution ne sont jamais faites à partir de données - elles sont immuables. – RedFilter

2

Toujours ints.

Vous apprécierez vous l'avez fait quand il est temps de passer les éléments de référence dans d'autres tables (à l'aide des clés étrangères)

Questions connexes