2010-09-21 7 views
1

J'ai une table avec 2 colonnes et 2 enregistrements. La colonne 1 ne changera jamais, mais la colonne 2 pourrait avoir des chances de changer, mais la table n'aura que 2 enregistrements.Clé primaire sur une colonne

Column1

manquant

non valide

Colonne2

\\ SQLServer \ destination \ manquant

\\ SQLServer \ destination \ invalide

Je suis un peu confus ici à propos de la clé primaire que je veux mettre sur cette table car il n'y a pas de colonne Id. alors quelle colonne je devrais avoir la clé primaire? ou dois-je ajouter une colonne supplémentaire avec l'identité et mettre la clé primaire sur cela?

Merci

Répondre

3

Les critères de choix et candidats clés primaires sont:

unicité

, irréductibilité, la stabilité, la simplicité et la familiarité

D'après ce que vous avez écrit, Column1 est certainement une clé candidate. Il a tous les 5 critères ci-dessus.

Column2 peut être une clé candidate si les deux valeurs de la table doivent toujours être uniques. Cependant, il n'est pas stable, donc Column1 est une meilleure clé à choisir pour les références de clés étrangères à la table (clé primaire).

Vous pouvez créer une troisième colonne numérique. Puisque vous contraintez la table à 2 lignes, il importe peu que la nouvelle colonne ait une séquence maintenue par le système (attribut identity).

Column1 a familiarité et la nouvelle colonne ne serait pas. À un niveau logique de discours, les deux Column1 et cette nouvelle colonne sont également simples. Physiquement, une chaîne de 7 caractères est au moins aussi grande qu'un nombre de 64 bits, donc un nombre de 32 bits occupe moins d'espace. Cependant, si vous choisissez d'ajouter une nouvelle colonne en raison de la taille physique, je considérerais une colonne char (1) avec 'M' pour manquant ou 'I' pour invalide, qui aurait toujours les 5 critères tout en occupant moins d'espace physique dans les tableaux de référence.

+1

+1 pour avoir réellement exprimé les critères – annakata

4

Oui. La colonne PK ne peut jamais contenir de doublons. Il ne doit pas être un nombre entier cependant, mais il doit être une colonne non-nulle unique.

2

À mon humble avis, vous devez toujours mettre une clé d'identification qui devient la clé primaire. "Always" est entre guillemets car il est possible d'argumenter dans les cas où ce n'est pas obligatoire, mais en général, c'est la voie à suivre, et certainement il est sûr de dire que c'est l'approche par défaut, et toute déviation de celui-ci devrait être étudié rigoureusement pour ses avantages.

Il existe un argument pour les clés "naturelles"; c'est-à-dire que vous mettez la clé primay sur le terrain qui est garanti unique et ne change jamais. Mais, d'après mon expérience, presque tout finit par changer, il est donc plus sûr d'utiliser un ID intégré auto-incrémenté par défaut.

2

Vous n'avez pas besoin d'une clé primaire sur une table qui n'a que deux enregistrements. La clé primaire est destinée à augmenter la vitesse de requête; avec 2 enregistrements, vous ne verrez presque aucune différence.

Modifier: En réponse aux commentaires, je tiens à souligner qu'aucun fournisseur de base de données mainstream n'applique l'utilisation des clés primaires. Il y a une raison pour qu'ils soient optionnels: à moins que la clé primaire ne soit requise par la fonctionnalité, elle n'appartient pas à la clé; YAGNI.

+2

Cela peut être "vrai", mais c'est incroyablement loin de vrai pour n'importe quel système réel. –

+0

Je parlais de ce cas particulier. La question indique que "la table aura seulement 2 enregistrements". – Saul

+1

Chaque table devrait avoir une clé et pour des raisons d'intégrité des données plutôt que de performance, même une table destinée à n'avoir qu'une seule ligne par ex. 'CREATE TABLE Constantes (verrouiller CHAR (1) DEFAUT 'x' NOT NULL VERIFIER (verrou = 'x'), pi DECIMAL ...);' – onedaywhen

0

Sur une table si petite que la création d'un index ralentirait réellement les choses. Les index sont stockés sous la forme d'un arbre binaire, donc une recherche sur cette petite partie d'une table, à moins que son index en cluster ne provoque plus de lectures que l'analyse de la table. Un index clusterisé serait "être" la table, mais encore une fois sur une si petite table le coût/bénéfice est "discutable". J'aime toujours avoir des lignes uniques, mais dans ce cas, le fait de laisser la table non indexée (appelée "tas") pourrait être le plus efficace. Je ne voudrais pas jeter un index sur la table, sauf si vous devez appliquer des contraintes. L'indexation pour les performances de requête ne va rien faire pour vous avec ce petit tableau. Si vous êtes obligé de mettre un PK sur la table pour une autre raison, alors je dirais le mettre sur la première colonne car elle est la plus courte, moins susceptible au hasard et il semble que cette table est simplement utilisée comme une recherche de toute façon ...

Questions connexes