39

Questo mi ha tormenta da un po ', e non posso arrivare a una soluzione che si sente destra ...Sottoscrizioni o camelCase negli identificatori PostgreSQL, quando il linguaggio di programmazione utilizza camelCase?

Dato un linguaggio OO in cui è formato camelCase la solita convenzione di denominazione per le proprietà degli oggetti, e di un esempio oggetto come questo:

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

Come dovrei modellare questa struttura in una tabella PostgreSQL?

ci sono tre opzioni principali:

  1. nomi delle colonne non quotate camelCase
  2. nomi delle colonne camelCase citati
  3. nomi non quotati (minuscolo) con sottolineature

Ognuno di essi hanno i loro inconvenienti:

  1. Gli identificatori non quotati si piegano automaticamente in lettere minuscole. Ciò significa che è possibile creare una tabella con una colonna canPlayPiano, ma il maiuscolo non raggiunge mai il database. Quando controlli la tabella, la colonna apparirà sempre come canplaypiano - in psql, pgadmin, spiega risultati, messaggi di errore, tutto.

  2. Gli identificatori citati mantengono il loro caso, ma una volta che li crei in questo modo, dovrai indicare sempre. IOW, se si crea una tabella con una colonna "canPlayPiano", un SELECT canPlayPiano ... avrà esito negativo. Questo aggiunge un sacco di rumore inutile a tutte le istruzioni SQL.

  3. I nomi in minuscolo con caratteri di sottolineatura non sono ambigui, ma non si adattano bene ai nomi utilizzati dalla lingua dell'applicazione. Dovrai ricordarti di usare nomi diversi per la memorizzazione (can_play_piano) e per il codice (canPlayPiano). Impedisce inoltre determinati tipi di automazione del codice, in cui le proprietà e le colonne DB devono essere identificate come stesse.

Quindi sono preso tra una roccia e un luogo duro (e una grossa pietra, ci sono tre opzioni). Qualunque cosa faccia, una parte si sentirà a disagio. Negli ultimi 10 anni ho usato l'opzione 3, ma continuo a sperare che ci sarebbe una soluzione migliore.

Sono grato per ogni consiglio che potresti avere.

PS: Mi rendo conto di dove si stia piegando il caso e della necessità di virgolette - lo standard SQL, ovvero l'adattamento dello standard di PostgreSQL. So come funziona; Sono più interessato alla consulenza sulle best practice che alle spiegazioni su come PG gestisce gli identificatori.

+0

Anche se si va con tutto minuscolo, vi consiglio di avere il vostro livello di astrazione del database avvolgere sempre tutti gli identificatori con le citazioni nelle query generate. Non è sempre possibile prevedere quali nuove parole chiave verranno utilizzate in una nuova versione, in modo da ottenere protezione dai nomi in conflitto citando. – kgrittn

+2

Non esiste una "migliore pratica". Metà del mondo preferisce i underscore, l'altra metà lo detesta. La metà del mondo preferisce i cappucci iniziali, l'altra metà lo detesta. La metà del mondo preferisce non distinguere tra maiuscole e minuscole, l'altra metà lo detesta. Mai nessuna di queste coppie di metà giunge ad un accordo, perché quelle questioni sono puramente soggettive. Fatti un favore e comincia a preoccuparti di ciò che conta davvero: scrivere un codice che faccia ciò che deve fare. –

+0

Puoi condividere la soluzione alternativa che hai utilizzato? Sto passando per la stessa situazione, ho proprietà oggetto in CamelCase che ho bisogno di mappare con colonne della tabella che sono in pattern di sottolineatura. Ho trascorso alcune ore, ma non ho ancora trovato una buona soluzione. –

risposta

21

Dato che PostgreSQL utilizza identificatori non sensibili alla distinzione tra maiuscole e minuscole con caratteri di sottolineatura, è necessario modificare tutti gli identificatori nell'applicazione per fare lo stesso? Chiaramente no. Quindi perché pensi che il contrario sia una scelta ragionevole?

La convenzione di PostgreSQL è nata attraverso un mix di conformità agli standard ed esperienza a lungo termine dei propri utenti. Insisti.

Se la traduzione tra nomi di colonna e identificatori diventa noiosa, chiedi al computer di farlo - sono bravi in ​​cose del genere. Immagino che quasi tutti i 9 milioni di librerie di astrazione del database possano farlo. Se hai un linguaggio dinamico ti porteranno tutte e due le righe di codice per scambiare i nomi delle colonne con gli identificatori in CamelCase.

+2

Ho appena realizzato che non ho mai contrassegnato questa domanda come risposta ... L'introduzione di una funzione di traduzione ORM all'inizio non mi sembrava molto elegante, ma a ben vedere (3-4 anni dopo) era la scelta giusta e non me ne sono mai pentito . Grazie per l'aiuto. – Zilk

+0

Felice di averlo aiutato. –

16

Se le colonne nella PostgreSQL sono con underscores, si può mettere alias ma con doule apici.

Esempio:

SELECT my_column as "myColumn" from table; 
Problemi correlati