Existe-t-il une convention de dénomination pour MySQL?

163

Voici comment je fais:

  1. Les noms de tables sont minuscules, utilise des underscores pour séparer les mots, et sont singuliers (par exemple foo, foo_baretc.
  2. J'ai généralement (pas toujours) un PK à incrémentation automatique. J'utilise la convention suivante: tablename_id(par exemple foo_id, foo_bar_idetc.).
  3. Lorsqu'une table contient une colonne qui est une clé étrangère, je copie simplement le nom de colonne de cette clé à partir de la table dont elle provient. Par exemple, disons que la table foo_bara le FK foo_id(où foo_idest le PK de foo).
  4. Lors de la définition des FK pour appliquer l'intégrité référentielle, j'utilise ce qui suit: tablename_fk_columnname(par exemple, pour poursuivre l'exemple 3, ce serait le cas foo_bar_foo_id). Puisqu'il s'agit d'une combinaison nom de table / nom de colonne, elle est garantie d'être unique dans la base de données.
  5. Je classe les colonnes comme ceci: PK, FK, puis le reste des colonnes par ordre alphabétique

Existe-t-il une meilleure façon de procéder, plus standard?

StackOverflowNewbie
la source
6
Est-il erroné d'utiliser pour l'incrémentation automatique PK juste "id"? Pourquoi? Le nom de la colonne n'a de sens que dans le contexte de la table. J'ai donc un "id" dans chaque table, et je peux avoir plusieurs id_ <table_name> pour FK.
Zbyszek
3
@Zbyszek Je pense que la raison la plus simple contre cela est simplement la cohérence / simplicité. Plutôt que d'avoir id_tableB=> oh pas de colonne de nom différent id , la cohérence de id_tableB=> id_tableBsemble juste plus soignée ... ou comme OP le fait: foo_id=> foo_idplutôt que foo_id=>id
Don Cheadle

Réponses:

106

Je dirais d'abord et avant tout: soyez cohérent.

Je pense que vous avez presque atteint les conventions que vous avez décrites dans votre question. Quelques commentaires cependant:

Je pense que les points 1 et 2 sont bons.

Point 3 - malheureusement, ce n'est pas toujours possible. Pensez à la façon dont vous feriez face à une seule table foo_barqui a des colonnes foo_idet qui font another_foo_idtoutes deux référence à la colonne de footable foo_id. Vous voudrez peut-être réfléchir à la façon de gérer cela. C'est un peu une affaire de coin!

Point 4 - Similaire au point 3. Vous souhaiterez peut-être introduire un nombre à la fin du nom de la clé étrangère pour permettre d'avoir plus d'une colonne de référence.

Point 5 - J'éviterais cela. Il vous en fournit peu et deviendra un casse-tête lorsque vous souhaitez ajouter ou supprimer des colonnes d'une table à une date ultérieure.

Quelques autres points sont:

Conventions de dénomination d'index

Vous souhaiterez peut-être introduire une convention de dénomination pour les index - ce sera une grande aide pour tout travail de métadonnées de base de données que vous voudrez peut-être effectuer. Par exemple, vous voudrez peut-être simplement appeler un index foo_bar_idx1ou foo_idx1- totalement à vous, mais cela vaut la peine d'être considéré.

Noms de colonnes au singulier ou au pluriel

Ce pourrait être une bonne idée d'aborder la question épineuse du pluriel vs unique dans vos noms de colonnes ainsi que dans vos noms de table. Ce sujet suscite souvent de grands débats dans la communauté DB. Je m'en tiendrais aux formes singulières pour les noms de table et les colonnes. Là. Je l'ai dit.

L'essentiel ici est bien sûr la cohérence!

Tom Mac
la source
Quoi de mieux que le point 5? Pourquoi cela pourrait devenir un casse-tête?
Rasshu
8
Pour faire un suivi, j'ai trouvé ce très utile pour ceux qui viendront ici plus tard: launchbylunch.com/posts/2014/Feb/16/sql-naming-conventions
...
1
J'ai du mal à trouver un bon "schéma" pour nommer mes tables qui contiennent des objets de modèles composés de deux noms (DocumentChapter, DocumentVersion, DocumentType etc.). Par exemple, pour DocumentType, je pourrais le nommer documenttypeou document_type. Je préférerais le dernier, mais la plupart du temps, j'ai une relation plusieurs à plusieurs et j'ai besoin d'une table qui ressemble document_document_type. Des suggestions pour gérer cela?
lexith
@ rsb2097 Re: point 5 - Après avoir ajouté une colonne (à la fin), la commande pourrait devenir invalide. Vous ne devriez pas ajouter de contrainte qui nécessite de réorganiser les colonnes car c'est une surcharge inutile.
Will Sheppard
21

La cohérence est la clé de toute norme de dénomination. Tant que c'est logique et cohérent, vous y êtes à 99%.

La norme elle-même est une préférence très personnelle - donc si vous aimez votre norme, exécutez-la.

Pour répondre carrément à votre question - non, MySQL n'a pas de convention / norme de dénomination préférée, donc utiliser la vôtre est bien (et la vôtre semble logique).

mal-wan
la source
4

Heureusement, les développeurs PHP ne sont pas des «bigots de Camel case» comme certaines communautés de développement que je connais.

Vos conventions sonnent bien.

Tant qu'ils sont a) simples et b) cohérents - je ne vois aucun problème :)

PS: Personnellement, je pense que 5) est exagéré ...

paulsm4
la source
2
Loin d'être des fanatiques, la casse de chameau est en fait désapprouvée par de nombreux membres de la communauté DB parce que certains des SGBDR sont insensibles à la casse au point de supprimer les cas (ou de tout changer en majuscules), de sorte que les choses deviennent vraiment laides très rapidement.
mal-wan
@mwan: pouvez-vous spécifier quel SGBDR? Et je suis moi-même un jockey de cas de chameau. Les majuscules ne servent qu'à un seul objectif dans mon schéma, pour indiquer les tables de jointure et (dans le cas des champs) pour indiquer les limites des mots, de sorte que le _ puisse être exclusivement pour indiquer un othertable_id (c.-à-d. Nom de table = autre table et champ dans cette table = id ). De plus, si l'autre SGBDR est insensible à la casse, qu'importe? Je ne vais jamais avoir une version majuscule et minuscule du même tableau! Oh, et je ne préférerais pas un SGBDR insensible à la casse - je préfère écrire un code cohérent
Samuel Fullman
7
J'aime l'ironie des utilisateurs de MySQL qui n'aiment pas CamelCase et le nom du produit que nous utilisons: MySQL, écrit en CamelCase
DBX12
1
@ DBX12 Pour être pédant, c'est PascalCase, pas camelCase, mais votre argument tient toujours.
MarredCheese
@MarredCheese Je n'y ai jamais pensé, mais vous avez raison. camelCase ne devrait pas avoir de bosse au début.
DBX12
1

Réponse simple: NON

Eh bien, au moins une convention de dénomination en tant que telle encouragée par Oracle ou la communauté, non, cependant, fondamentalement, vous devez être conscient de suivre les règles et les limites pour les identifiants, telles qu'indiquées dans la documentation MySQL: https://dev.mysql.com /doc/refman/8.0/en/identifiers.html

À propos de la convention de dénomination que vous suivez, je pense que c'est correct, juste le numéro 5 est un peu inutile, je pense que la plupart des outils visuels de gestion de bases de données offrent une option pour trier les noms de colonnes (j'utilise DBeaver, et il l'a), donc si le purpouse a une belle présentation visuelle de votre table, vous pouvez utiliser cette option que je mentionne.

Par expérience personnelle, je recommanderais ceci:

  • Utilisez des minuscules . Cela garantit presque l'interopérabilité lorsque vous migrez vos bases de données d'un serveur à un autre. Parfois, le lower_case_table_namesn'est pas correctement configuré et votre serveur commence à générer des erreurs simplement en ne reconnaissant pas votre standard camelCase ou PascalCase (problème de sensibilité à la casse).
  • Noms courts . Simple et clair. Le plus simple et le plus rapide est d'identifier votre table ou vos colonnes, mieux c'est. Croyez-moi, lorsque vous faites beaucoup de requêtes différentes en peu de temps, il vaut mieux avoir tout simple à écrire (et à lire).
  • Évitez les préfixes . Sauf si vous utilisez la même base de données pour des tables d'applications différentes, n'utilisez pas de préfixes. Cela ne fait qu'ajouter plus de verbosité à vos requêtes. Dans certaines situations, cela peut être utile, par exemple, lorsque vous souhaitez identifier les clés primaires et les clés étrangères, qui utilisent généralement les noms de table comme préfixe pour les colonnes id.
  • Utilisez des traits de soulignement pour séparer les mots . Si vous voulez continuer à utiliser plus d'un mot pour nommer une table, colonne, etc., utilisez donc pour underscores separating_the_words , cela aide pour la lisibilité (vos yeux et votre cerveau stressé va vous remercier).
  • Soyez cohérent . Une fois que vous avez votre propre norme, suivez-la. Ne soyez pas la personne qui crée les règles et qui est la première à les enfreindre, c'est honteux.

Et qu'en est-il de la dénomination «Plural vs Singular»? Eh bien, c'est surtout une situation de préférences personnelles. Dans mon cas, j'essaie d'utiliser des noms pluriels pour les tables parce que je pense qu'une table est une collection d'éléments ou un paquet contenant des éléments, donc un nom pluriel a du sens pour moi; et des noms singuliers pour les colonnes parce que je vois les colonnes comme des attributs qui décrivent singulièrement ces éléments de table.

Fabrizio Valence
la source