Les clés étrangères doivent-elles devenir la clé primaire du tableau?
J'ai une table (session_comments) avec les champs suivants de la structure:
student_id (foreign key to students table)
session_id (foreign key to sessions table)
session_subject_ID (foreign key to session_subjects table)
user_id (foreign key to users table)
comment_date_time
comment
Maintenant, la combinaison de student_id, session_id, et session_subject_id permettra d'identifier de manière unique un commentaire à propos de cet étudiant pour la session sujet.
Étant donné que les combinés, ils sont uniques, même si elles sont des clés étrangères, est-il un avantage pour moi de faire d'eux les combinés de la clé primaire de cette table?
Merci encore.
source d'informationauteur Carvell Fenton
Vous devez vous connecter pour publier un commentaire.
Si vous faites ces trois la clé primaire ou pas, vous aurez toujours besoin d'une sorte de contrainte d'unicité de garantir qu'un étudiant ne peut pas être associés à la même session et session_subject_id deux fois. Si ce scénario est autorisé, vous devez développer votre contrainte d'unicité pour inclure une autre colonne.
Peu importe ce que vous faites un choix, vous devez absolument avoir une sorte de contrainte d'unicité sur la table.
Si vous êtes à débattre sur l'opportunité de créer un substitut à la clé primaire + une contrainte unique sur trois colonnes, je dirais que ça dépend de ce tableau et demander à l'enfant de tables. Si ça va, puis de référencement, la clé de substitution sera plus facile et plus petits. Si il ne sera pas, puis de l'OMI, la clé de substitution n'a pas vraiment vous donner beaucoup et vous pourriez aussi bien utiliser les trois colonnes que le PK.
Cela dépend du reste de l'application.
Si vous n'allez pas avoir les clés étrangères pour les commentaires de la table (ce qui semble probable), c'est très bien.
Si vous devez vous référer aux commentaires à partir d'une autre table, vous seriez mieux de créer un index unique avec votre 3 domaines, en plus d'un Numéroauto clé primaire qui servira dans d'autres tables comme la clé étrangère (beaucoup plus simple et moins cher que les 3 champs).
Le débat de naturel vs artificiel touches est aussi vieille que toute la base de données de mise en œuvre.
Lire sur les avantages et les inconvénients de sur wikipedia.
Arguments en faveur de la substitution de clés sont facilement contesté sur le plan théorique (par exemple l'argument qu'avec des clés naturelles, vous courez le risque de votre PK devenir non-unique peut être contre-défendues avec réponse - bon!!! si je suis dans cette situation, il est bon que les choses allaient se briser au lieu d'avoir artificiellement unique clés primaires avec des enregistrements en double pour les données réelles).
Un autre bon argument est que les touches sont soit licenciés (il y a une autre clé unique sur la table) ou qu'ils sont en vous permettant de stocker essentiellement non-enregistrements uniques.
Encore, de trouver de bonnes naturel touches est parfois si dur que vous devez choisir quelque chose d'artificiel et de permettre la situation quand vous avez une personne avec un même nom, née à la même date (ou avec date inconnue), avec un autre xy propriétés qui sont les mêmes en valeur.
Aussi, il n'est pas si clair, qu'est-ce que l'artificiel et le naturel.
Vous pourriez dire par exemple que le SSN est naturel pour vos données. Même si il est vraiment composé le numéro.
Que pour la performance de multi-touches relations ne sont pas aussi mauvais que vous le pensez, en outre - il des segments les indices d'une façon naturelle et avec ces touches, vous finissent généralement avec une base de données qui effectue vraiment bien avec les requêtes, sans autres indices.
Si vous tenez compte de ces problèmes au sérieux et si vous essayez de construire des systèmes complexes, veuillez lire certains de la bonne littérature (C. J. Date Introduction aux Systèmes de Base de données, actuellement à la 8ème édition vient à l'esprit)
J'aimerais vraiment vous recommandons d'utiliser une clé primaire qui est généré par votre base de données de choix. Principalement parce que si vous modifiez la structure de la table pendant tout l'avenir d'entretien alors vous courez le risque de votre clé unique de devenir non-unique. Ce qui peut être un problème plus difficile à résoudre. Aussi avoir une clé primaire unique rend l'interrogation de la table de beaucoup, beaucoup plus facile.
Des Identifiants uniques pour postgres: http://www.postgresql.org/docs/8.1/interactive/datatype.html#DATATYPE-SERIAL
Des Identifiants uniques pour Mysql: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
La seule raison pour en faire une clé primaire composite consisterait à appliquer un commentaire par élève/Séance/Sujet. En supposant que vous ne voulez pas le faire, je ne voudrais pas créer une autre clé.
Pas. Les clés ÉTRANGÈRES peuvent contenir des valeurs Null qui ne sont pas autorisés dans les clés PRIMAIRES. Le meilleur que vous pouvez faire est de créer un index UNIQUE à partir des colonnes.
Créer une clé PRIMAIRE sur la table.
Réponse: Ma prochaine question est la suivante:
Est-il une possibilité de chevauchement entre les touches de l'4 tables?
Ces deux serait de créer le même clé composite de 101010101:
étudiant: 1010,de la session: 10,sous réserve: 10 utilisateur: 1
étudiant: 10,session: 1010,sous réserve: 10 utilisateur: 1
Je signale simplement que les quatre colonnes doivent être clairement différents domaines pour le chevauchement de diminuer possibilité.
Probablement préférable d'aller avec une vraie clé primaire.