108 votes

Nommage des colonnes d'ID dans les tables de base de données

Je me demandais peuples opinions sur la dénomination des ID des colonnes dans les tables de base de données.

Si j'ai une table appelée Factures avec une clé primaire d'une colonne d'identité, je dirais que la colonne InvoiceID de sorte que je n'entreraient pas en conflit avec d'autres tables et il est évident que ce qu'il est.

Là où je suis workind actuelle, ils ont appelé tous les ID colonnes ID.

Ils vont donc effectuer les opérations suivantes:

Select  
    i.ID 
,   il.ID 
From
    Invoices i
    Left Join InvoiceLines il
        on i.ID = il.InvoiceID

Maintenant, je vois quelques problèmes ici:
1. Vous auriez besoin de faire un alias de colonnes du select
2. ID = InvoiceID ne rentre pas dans mon cerveau
3. Si vous n'avez pas d'alias de tables et de visée InvoiceID est-il évident que la table est sur?

Quelles sont les pensées d'autres personnes sur le sujet?

162voto

Kevin Points 57797

J'ai toujours préféré l'ID de TableName + ID de la colonne id et puis TableName + ID de la clé étrangère. De cette façon, toutes les tables ont le même nom pour le champ id et il n'y a pas redondant description. Cela semble plus simple pour moi parce que toutes les tables ont la même clé primaire nom de champ.

Aussi loin que la jointure de tables et de ne pas savoir qui d'Id champ qui appartient à la table qui, à mon avis, la requête doit être écrite à gérer cette situation. Là où je travaille, nous avons toujours prefece les champs que nous utilisons dans une déclaration à la table/table d'alias.

54voto

Echostorm Points 4824

Theres été un nerd de la lutte à propos de cette chose dans ma société de la fin. L'avènement de LINQ a fait redondant tablename+ID de modèle encore plus évidemment ridicule à mes yeux. Je pense que la plupart des gens raisonnables dirai que si vous êtes à la main de la rédaction de votre SQL de manière que vous ayez à préciser de noms de table pour différencier les FKs alors ce n'est pas seulement une épargne sur le typage, mais il ajoute de la clarté à votre SQL à utiliser juste l'ID que vous pouvez voir clairement qui est le PK et qui est la FK.

c'est à dire. LEFT JOIN Clients de l'Employé.ID = Client.EmployeeID

me dit pas seulement que les deux sont liés, mais qui est le PK et qui est le FK

alors que dans l'ancien style, vous êtes obligé de regarder ou de l'espoir qu'ils ont été nommés.

32voto

HLGEM Points 54641

ID est un identifiant SQL Antipattern. Voir http://www.amazon.com/s/ref=nb_sb_ss_i_1_5?url=search-alias%3Dstripbooks&field-keywords=sql+antipatterns&sprefix=sql+a

Si vous avez beaucoup de tables avec ID l'id de vous rendre beaucoup plus difficile. Il obscurcit le sens et rend les requêtes complexes, plus difficiles à lire aussi bien que de vous obliger à utiliser des alias pour se différencier sur le rapport lui-même.

En outre, si quelqu'un est assez stupide pour utiliser une jointure naturelle dans une base de données où elles sont disponibles, vous permettra de rejoindre les mauvais enregistrements.

Si vous souhaitez utiliser l'AIDE de la syntaxe que certains dbs permettre, vous ne pouvez pas si vous utilisez des ID.

Si vous utilisez des ID, vous pouvez facilement se retrouver avec une erreur de joindre si vous arrive d'être la copie de la syntaxe de jointure (ne me dites pas que personne ne fait jamais ça!)et oubliez pas de changer l'alias dans la condition de jointure.

Vous avez donc maintenant

select * 
from table1 t1 
join table2 t2 on t1.id = t2.table1id
join table3 t3 on t1.id = t3.table2id

lorsque vous avez voulu dire

select * 
from table1 t1 
join table2 t2 on t1.id = t2.table1id
join table3 t3 on t2.id = t3.table2id

Si vous utilisez tablenameID que le champ id, ce genre d'accident erreur est beaucoup moins susceptible de se produire et beaucoup plus facile à trouver.

30voto

Jason Cohen Points 36475

Nous utilisons InvoiceID , pas ID . Cela rend les requêtes plus lisibles - lorsque vous voyez ID seul, cela peut vouloir dire quelque chose, en particulier lorsque vous aliasez la table en i .

12voto

Nir Points 18250

Ce n'est pas vraiment important, vous rencontrerez probablement des problèmes similaires dans toutes les conventions de nommage.

Mais il est important d'être cohérent pour ne pas avoir à consulter les définitions de table à chaque fois que vous écrivez une requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X