2011-09-26 4 views
2

J'ai lu à certains endroits que c'est une bonne pratique d'utiliser typiquement une clé primaire auto-incrémentée pour la plupart des tables MySQL, plutôt que de simplement se fier à un champ non-incrémenté qui sera appliqué pour être unique.Pour utiliser l'auto-incrémentation dans MySQL ou non?

Ma question concerne spécifiquement une table utilisateur et une table connectée par une clé étrangère. Voici le schéma:

TABLE Users { 
    id 
    name 
    ... 
} 

TABLE Authors { 
    user_id (FK) 
    author_bio 
} 

Si la table authors avoir sa propre clé primaire auto-incrémentée aussi bien, ou doit-elle compter sur la clé étrangère user_id comme une clé primaire?

AUSSI

Y at-il des raisons de performances notables à ne pas utiliser l'ID auto-incrémentée comme primaire?

+1

En utilisant la clé primaire de la table 'USERS' comme la clé primaire des' AUTEURS 'table suggère une relation 1: 1. Normalisation (3NF?) Dicte qu'il ne devrait pas y avoir deux tables dans cette situation. L'ajout d'une clé primaire séparée (autoincrément ou non) ne change pas cela ... –

+0

OMG - un utilisateur PEUT être un auteur, mais un auteur sera un utilisateur. C'est ce que tu veux dire? – johnnietheblack

+0

Non, s'il n'y a qu'un seul utilisateur associé à un seul enregistrement AUTHOR, c'est-à-dire 1: 1. La décision dépend de vos règles d'affaires, mais les auteurs ont été connus pour avoir des pseudonymes (pseudonymes) - IE: Steven King a écrit comme Richard Bachman –

Répondre

3

Ce n'est pas non plus-ou. Si vous utilisez une clé primaire d'incrémentation automatique et que vous disposez de clés candidates qui doivent appliquer des contraintes, votre schéma doit avoir les deux. Les tables user et author doivent avoir des clés primaires individuelles. (Chaque table doit avoir une clé primaire.) Je n'utiliserais pas la clé étrangère comme clé primaire. Si c'est vraiment le cas, je n'aurais pas de table d'auteur séparée; Je mettrais ces colonnes dans la table des utilisateurs. PS: ma préférence d'appellation est singulière pour les tables. Il devrait être user et author tables. Ils contiennent plusieurs lignes, mais une seule ligne signifie une seule entité.

+0

Donc vous dites que c'est cool d'avoir un primaire auto-incrémenté, et puis l'étranger, même si l'étranger est unique et pourrait (techniquement) être utilisé comme primaire? Il y a quelque chose à propos de la cohérence de chaque table ayant une clé auto-incrémentée que j'aime. – johnnietheblack

+0

Duffy, merci d'avoir élaboré ... Je pense que je suis d'accord avec vos pensées ... quelque chose semble plus propre sachez que chaque table aura un fil commun de type clé primaire – johnnietheblack

1

Vous souhaitez absolument que la table Authors possède sa propre clé primaire, telle que authors_id, et que vous ayez user_id comme clé étrangère.

+0

Pouvez-vous élaborer sur pourquoi, afin que je puisse comprendre l'essentiel? – johnnietheblack

1

Cela dépend de ce que vous essayez d'accomplir. Si chaque auteur correspond exactement à un utilisateur (et vous êtes sûr que cela ne va pas changer), vous pouvez obtenir user_id comme clé primaire. Sinon, vous aurez besoin d'une clé primaire indépendante pour Authors.

(Notez que la relation inverse ne doit pas être vrai: pas chaque utilisateur doit mapper un auteur.)