Clé primaire/Clé étrangère de la convention de nommage
Dans notre dev groupe, nous avons un débat qui fait rage au sujet de la convention d'affectation de noms pour les Clés Primaires et Étrangères. Il n'y a fondamentalement deux écoles de pensée au sein de notre groupe:
1:
Primary Table (Employee)
Primary Key is called ID
Foreign table (Event)
Foreign key is called EmployeeID
ou
2:
Primary Table (Employee)
Primary Key is called EmployeeID
Foreign table (Event)
Foreign key is called EmployeeID
Je préfère ne pas répéter le nom de la table dans l'une des colonnes (Donc je préfère l'option 1 ci-dessus). Sur le plan conceptuel, il est compatible avec un grand nombre de pratiques recommandées dans d'autres langues, où vous n'utilisez pas le nom de l'objet dans ses noms de propriété. Je pense que la mention de la clé étrangère EmployeeID
(ou Employee_ID
peut-être mieux) indique au lecteur que c'est le ID
colonne de la Employee
Table.
Certains d'autres préfèrent l'option 2 où vous le nom de la clé primaire préfixés par le nom de la table, de sorte que le nom de la colonne est la même tout au long de la base de données. Je vois ce point, mais vous ne pouvez pas distinguer une clé primaire d'une clé étrangère.
Aussi, je pense que c'est redondant d'avoir le nom de la table dans la colonne nom, parce que si vous pensez de la table comme une entité et d'une colonne comme une propriété ou un attribut de l'entité, pensez-vous que l'attribut ID de l' Employee
, pas la EmployeeID
attribut d'un employé. Je ne vais pas faire une demande à mon collègue que son PersonAge
ou PersonGender
est. Je lui demande ce que son Âge est.
Donc, comme je l'ai dit, c'est un débat qui fait rage et nous allons sur et sur et sur ce sujet. Je suis intéressé à obtenir de nouvelles perspectives.
- la question des doublons de ce stackoverflow.com/questions/208580/...
- J'ai lu plus de 10 questions similaires et a finalement trouvé le top 3 réponses sont bonnes ici : stackoverflow.com/a/465146/781695
- Juste une note de côté: Choix 2 vous permettra de "Jointure Naturelle'. Diable, pourquoi ne pas toujours le faire en choix 1 par l'ajout d'Employés".ID d'Employé'. Mais le mieux pratiquer la voie semble être "Adhérer" à l'aide " SUR l'Employé.ID = Event.EmployeeID'.
- Dans les deux cas, et d'avoir à utiliser des alias (ou " table_name.column_name") dans un ou plusieurs queires parce que vous êtes, dans les deux cas, répéter les noms de colonne.
Vous devez vous connecter pour publier un commentaire.
Il n'a pas vraiment d'importance. Je n'ai jamais couru dans un système où il y a une réelle différence entre les choix 1 et choix 2.
Jeff Atwood avait un excellent article d'un moment de retour sur ce sujet. En fait, les gens débattre et discuter le plus furieusement ces sujets, qu'ils ne peuvent pas tromper. Ou à partir d'un angle différent, les sujets qui ne peut être gagné que par le biais de l'obstructionnisme style d'endurance en fonction de dernier homme debout arguments.
En choisir un et de leur dire de se concentrer sur les questions qui ont réellement un impact sur votre code.
EDIT: Si vous voulez vous amuser, demandez-leur de préciser, dans la durée, pourquoi leur méthode est supérieure pour les références de table.
Si les deux colonnes ont le même nom dans les deux tables (convention n ° 2), vous pouvez utiliser l'AIDE de la syntaxe SQL pour enregistrer la saisie et réutilisable bruit:
Un autre argument en faveur de la convention n ° 2, c'est que c'est la façon dont le modèle relationnel a été conçu.
SELECT name, address, amount FROM employees NATURAL JOIN payroll
.employee_id
.Je pense que cela dépend de comment vous demande est mis en place. Si vous utilisez l'ORM ou la conception de vos tables pour représenter des objets, puis l'option 1 est pour vous.
J'aime le code de la base de données dans son propre calque. Je contrôle tout et l'application des appels de procédures stockées. Il est agréable d'avoir des ensembles de résultats à remplir la colonne des noms, surtout quand il y a beaucoup de tables jointes et de nombreuses colonnes retournées. Avec ce stype de l'application, j'ai comme dans l'option 2. J'ai vraiment envie de voir la colonne de noms de match sur les jointures. J'ai travaillé sur de vieux systèmes où ils n'ont pas de match et c'était un cauchemar,
Ni la convention fonctionne dans tous les cas, alors pourquoi en avez un? Utiliser le bon sens...
par exemple, pour l'auto-table de référence, lorsqu'il y a plus d'un FK colonne que l'auto-référence la même table PK, vous AVEZ de violer les deux "normes", puisque les deux FK colonnes ne peuvent pas être nommés de la même façon... par exemple, table employeetable avec EmployeeId PK, SupervisorId FK, MentorId Fk, PartnerId FK, ...
Je suis d'accord qu'il y a peu à choisir entre eux. Pour moi beaucoup plus importante chose à propos de la standard est le "standard" de la partie.
Si les gens commencent à faire leurs propres choix", ils devraient être suspendus par leur néants. Mon humble avis 🙂
Avez-vous examiné les questions suivantes?
table_name.column_name
dans les requêtes et ne pas avoir à utiliser des alias pour les noms de colonne si vous ne disposez pas répété les noms...La convention nous utilisons où je travaille est assez proche d'Un, à l'exception que nous avons tables de nom au pluriel (c'est à dire, les "employés") et l'utilisation des caractères de soulignement entre la table et le nom de la colonne. L'avantage, c'est que pour faire référence à une colonne, c'est soit "employés _ id" ou "employés.id", selon la façon dont vous souhaitez accéder. Si vous avez besoin de spécifier ce tableau, la colonne est à venir à partir de, "les employés.les employés _ id" est certainement superflu.
Si vous regardez le code de l'application, pas seulement les requêtes de base de données, certaines choses me semblent clairs:
Table de définitions généralement directement à la carte pour une classe qui décrit un objet, de sorte qu'ils devraient être au singulier. Pour décrire une collection d'un objet, je l'habitude d'ajouter "Tableau" ou "Liste" ou "Collection" au nom singulier, plus clairement que l'utilisation des pluriels indique non seulement que c'est une collection, mais quel type de collection c'est. De ce point de vue, je vois un nom de table comme le nom de la collection, mais le nom du type de l'objet dont elle est l'une collection. Un DBA qui n'a pas d'écrire le code de l'application peut manquer à ce point.
Les données que j'ai traiter avec souvent utilise "ID" pour les non-clé des fins d'identification. Pour éliminer la confusion entre la touche "ID"s et non-clé "ID"s, pour la clé primaire nom, nous utilisons des "Clés" (c'est ce qu'il est, n'est-ce pas?) préfixe le nom de la table ou une abréviation du nom de la table. Cette préfixation (et je réserve ce que pour la clé primaire) en fait le nom de la clé unique, ce qui est particulièrement important, car nous utiliser des noms de variable sont les mêmes que la base de données des noms de colonne, et la plupart des classes ont un parent, identifié par le nom de la clé parente. Cela est également nécessaire pour s'assurer qu'il n'est pas un mot clé réservé, qui "Touche" tout seul. Afin de faciliter le maintien des noms de variables uniformes, et de fournir à des programmes qui ne les jointures naturelles, les clés étrangères ont le même nom est utilisé dans le tableau dans lequel elles sont la clé primaire. J'ai plus d'une fois rencontré des programmes qui fonctionnent beaucoup mieux de cette façon en utilisant les jointures naturelles. Sur ce dernier point, j'avoue un problème avec l'auto-référencement des tableaux, que j'ai utilisé. Dans ce cas, je ferais une exception pour la clé étrangère de la règle de nommage. Par exemple, je voudrais utiliser ManagerKey de clé étrangère dans la table des Employés à point à un autre enregistrement dans cette table.
J'aime convention #2 - dans la recherche de ce sujet, et de trouver cette question avant de poster le mien, j'ai couru dans la question où:
Je suis la sélection * à partir d'une table avec un grand nombre de colonnes et de la joindre à un deuxième tableau qui de même a un grand nombre de colonnes. Les deux tables ont un "id" de la colonne comme clé primaire, et cela signifie que je dois spécifiquement choisir chaque colonne (autant que je sache), afin de faire de ces deux valeurs uniques dans le résultat, c'est à dire:
Bien que l'utilisation de la convention #2 signifie que j'ai encore un peu de colonnes dans le résultat avec le même nom, je peux maintenant préciser qui id j'ai besoin de l'enfant (parent ou enfant) et, comme Steven Huwig suggéré, le
USING
déclaration simplifie les choses plus loin.SELECT *
est un non-non pour la plupart de la production de requêtes, de toute façon, donc ce n'est pas vraiment une raison de choisir un standard de nommage.SELECT *
est un non-non pour la plupart de la production de requêtes. Si elle augmente votre vitesse de façon significative le développement, et rend votre code plus concis et lisible vous permettant de vous concentrer sur des choses plus importantes - pourquoi ne pasSELECT *
? Cela dépend beaucoup des circonstances de chaque situation et est un compromis entre plusieurs facteurs. Une règle rarement s'adapte à tout.J'ai toujours utilisé des userId comme un penalty sur une table et userId sur une autre table comme un FK. m 'sérieusement penser à l'aide de userIdPK et userIdFK que des noms pour identifier l'un de l'autre. Il va m'aider à identifier PK et FK rapidement lorsque l'on regarde les tableaux et il semble que cela va effacer le code lors de l'utilisation de PHP/SQL pour accéder aux données en la rendant plus facile à comprendre. Surtout quand quelqu'un d'autre regarde mon code.
- Je utiliser convention #2. Je travaille avec un héritage du modèle de données maintenant où je ne sais pas ce qui en tient lieu dans une table donnée. Où est le mal dans le fait d'être verbeux?
La façon de nommer la clé étrangère
role_id
où le rôle est le rôle de l'entité référencée a bord de la table à portée de main. Cela résout la question de la référence récursive et plusieurs fks à la même table.
Dans de nombreux cas seront identiques à la table référencée nom. Dans ce cas, il devient identique à l'une de vos propositions.
En tout cas havin long des arguments est une mauvaise idée
"Où "employé INNER JOIN commande SUR commande.employee_id = employé.id" est-il un besoin supplémentaire de qualification?".
Il n'est pas nécessaire pour une qualification additionnelle en raison de la qualification, j'ai parlé de y est déjà.
"la raison que l'entreprise d'un utilisateur se réfère à l'Ordre de l'ID ou ID de l'Employé est de fournir le contexte, mais à un dabase niveau que vous avez déjà contexte parce que vous êtes en vous référant à la table".
Prie, dites-moi, si la colonne est nommée 'ID', alors comment est-ce que "vous référant [sic] à la table" fait exactement, à moins que, en qualifiant cette référence à la colonne ID exactement de la manière que j'ai parlé de ?