web-dev-qa-db-fra.com

Souligne ou camelCase dans les identifiants PostgreSQL, lorsque le langage de programmation utilise camelCase?

Cela me dérange depuis un moment et je n'arrive pas à trouver une solution qui semble droite...

Étant donné un OO langage dans lequel la convention de dénomination habituelle pour les propriétés d'objet est camelCased, et un exemple d'objet comme celui-ci:

{
    id: 667,
    firstName: "Vladimir",
    lastName: "Horowitz",
    canPlayPiano: true
}

Comment dois-je modéliser cette structure dans une table PostgreSQL?

Il existe trois options principales:

  1. noms de colonnes camelCase sans guillemets
  2. noms de colonnes camelCase entre guillemets
  3. noms non entre guillemets (minuscules) avec des traits de soulignement

Ils ont chacun leurs inconvénients:

  1. Les identifiants non cotés se replient automatiquement en minuscules. Cela signifie que vous pouvez créer une table avec une colonne canPlayPiano, mais la casse mixte n'atteint jamais la base de données. Lorsque vous inspectez la table, la colonne apparaîtra toujours sous la forme canplaypiano - dans psql, pgadmin, expliquera les résultats, les messages d'erreur, tout.

  2. Les identifiants cités conservent leur casse, mais une fois que vous les créez comme ça, vous devrez toujours les citer. IOW, si vous créez une table avec un "canPlayPiano" colonne, un SELECT canPlayPiano ... échouera. Cela ajoute beaucoup de bruit inutile à toutes les instructions SQL.

  3. Les noms en minuscules avec des traits de soulignement ne sont pas ambigus, mais ils ne correspondent pas bien aux noms que le langage d'application utilise. Vous devrez vous rappeler d'utiliser des noms différents pour le stockage (can_play_piano) et pour le code (canPlayPiano). Il empêche également certains types d'automatisation de code, où les propriétés et les colonnes de base de données doivent être nommées de la même manière.

Je suis donc coincé entre un rocher et un endroit dur (et une grosse pierre; il y a trois options). Quoi que je fasse, une partie va me sembler gênante. Depuis environ 10 ans, j'utilise l'option 3, mais j'espère toujours qu'il y aurait une meilleure solution.

Je vous remercie pour tout conseil que vous pourriez avoir.

PS: Je me rends compte d'où vient le cas de pliage et le besoin de citations - le standard SQL, ou plutôt l'adaptation PostgreSQL du standard. Je sais comment ça fonctionne; Je suis plus intéressé par des conseils sur les meilleures pratiques que par des explications sur la façon dont PG gère les identifiants.

58
Zilk

Étant donné que PostgreSQL utilise des identifiants insensibles à la casse avec des traits de soulignement, devez-vous modifier tous vos identifiants dans votre application pour faire de même? Pas du tout. Alors pourquoi pensez-vous que l'inverse est un choix raisonnable?

La convention dans PostgreSQL est née d'un mélange de conformité aux normes et d'expérience à long terme de ses utilisateurs. Restez avec elle.

Si la traduction entre les noms de colonne et les identifiants devient fastidieuse, demandez à l'ordinateur de le faire - ils sont bons dans des choses comme ça. Je suppose que presque toutes les 9 millions de bibliothèques d'abstraction de bases de données peuvent le faire. Si vous avez un langage dynamique, il vous faudra deux lignes de code pour échanger les noms de colonne en identificateurs dans CamelCase.

29
Richard Huxton

Si vos colonnes dans le PostgreSQL sont avec underscores, vous pouvez mettre des alias mais avec guillemets doubles.

Exemple :

SELECT my_column as "myColumn" from table;
18
Mirza Selimovic