Denominazione tabella: trattino basso vs Camelcase? spazi dei nomi? Singolare vs Plurale?


91

Ho letto un paio di domande / risposte su StackOverflow cercando di trovare il "migliore", o forse dovrei dire il modo accettato, per nominare le tabelle su un database.

La maggior parte degli sviluppatori tende a denominare le tabelle in base alla lingua che richiede il database (JAVA, .NET, PHP, ecc.). Tuttavia sento che non è giusto.

Il modo in cui ho nominato le tabelle fino ad ora sta facendo qualcosa del tipo:

doctorsMain
doctorsProfiles
doctorsPatients
patientsMain
patientsProfiles
patientsAntecedents 

Le cose che mi interessano sono:

  • Leggibilità
  • Identificazione rapida del modulo da cui proviene il tavolo (medici || pazienti)
  • Facile da capire, per evitare confusioni.

Vorrei leggere tutte le opinioni sulle convenzioni di denominazione. Grazie.

Risposte:


183

Essere coerenti è molto più importante di quale particolare schema usi.


21
In altre parole, sì, ben fatto, hai identificato alcuni schemi coerenti. Vai avanti!
Phil H

3
+1 per il commento. Inoltre, una nota a margine dell'attuale schema di denominazione PascalCase è migliore, specialmente se non usi gli alias per le query SQL. In questo modo puoi semplicemente usare camelcase sui nomi delle colonne della tabella e Pascal Case sui nomi delle tabelle.
MarioRicalde

3
Il caso Pascal / camel per i nomi delle tabelle potrebbe portare ad alcuni problemi. Ogni tabella avrà un file nel filesystem e alcune di esse non fanno distinzione tra maiuscole e minuscole (es. OSX).
ismriv

2
@ismriv è un problema solo se sei incoerente, se ti riferisci sempre a tabelle / viste / colonne con lo stesso caso coerente non dovresti avere problemi, non essere pigro quando scrivi questi nomi ti farà guadagnare un grande vantaggio in seguito durante la lettura. L'uso di PascalCase per le tabelle e camelCase per le colonne aiuta a identificare il tipo di un nome a colpo d'occhio e imita anche le convenzioni comuni orientate agli oggetti.
TWiStErRob

Sono totalmente d'accordo sul fatto che la coerenza sia la chiave, ma questa è una vecchia domanda e per le persone che utilizzano piattaforme di database più recenti come Redshift e Snowflake che impostano per impostazione predefinita tutti gli identificatori maiuscoli o minuscoli, aggiungerei che è abbastanza importante pensare al tuo convenzioni di denominazione fin dall'inizio. Scegliere di utilizzare una convenzione di denominazione come Camel Case su queste piattaforme può causare in seguito alcuni inutili mal di testa, ad esempio dovrai usare sempre identificatori tra virgolette e la risoluzione dei nomi degli oggetti potrebbe produrre risultati inaspettati.
Nathan Griffiths

23

Di solito uso PascalCase e le entità sono singolari:

DoctorMain
DoctorProfile
DoctorPatient

Imita le convenzioni di denominazione per le classi nella mia applicazione mantenendo tutto abbastanza ordinato, pulito, coerente e facile da capire per tutti.


3
Si si lo faccio. Sono un po 'nebbioso questa mattina. Effettuando la modifica ... grazie.
Justin Niessner

3
È anche noto come "CapitalCase".
corsiKa

4
Non l'ho mai sentito chiamare "CapitalCase" nei miei 30 anni di esperienza. L'ho sentito chiamare di più "caso cammello" e "caso Pascal" è stato ripreso di recente. Sono venuto qui per vedere perché le persone sembrano utilizzare il caso del cammello per SQL quando storicamente è stato per lo più senza distinzione tra maiuscole e minuscole. Di certo non voglio restare indietro con i tempi.
Sinthia V

@SinthiaV Non conosco gli altri, ma nel nostro caso poiché stiamo usando un JS ORM (purtroppo) le opzioni erano 1) rompere la convenzione usando camelCase nel db 2) rompere la convenzione usando snake_case in JS 3) map camelCase in JS a snake_case in db. Abbiamo deciso senza troppa riflessione iniziale di utilizzare camelCase nel db, e non è stato poi così male, ma citare tutto è un po 'una seccatura.
Andy

@SinthiaV poiché un commento inutile potrebbe essere nel contesto dell'attuale domanda SO, PascalCase non è lo stesso di camelCase. PascalCase rende maiuscola la prima lettera di ogni parola (soprattutto la prima) mentre camelCase usa solo le parole dopo la prima. Ulteriori letture: medium.com/better-programming/…
curioso

11

Natura senza distinzione tra maiuscole e minuscole dei supporti SQL Underscores_Scheme. Il software moderno tuttavia supporta qualsiasi tipo di schema di denominazione. Tuttavia a volte possono portare a bug, errori o fattori umani fastidiosi in UPPERCASINGEVERYTHINGmodo che coloro che hanno selezionato entrambi Pascal_Casee lo Underscore_Caseschema vivano con tutti i nervi al posto giusto.


10

Un'aggregazione della maggior parte di quanto sopra:

  • non fare affidamento sul caso nel database
  • non considerare il caso o il separatore come parte del nome, solo le parole
  • usa qualunque separatore o caso sia lo standard per la tua lingua

Quindi puoi tradurre facilmente (anche automaticamente) i nomi tra gli ambienti.

Ma aggiungerei un'altra considerazione: potresti scoprire che ci sono altri fattori quando passi da una classe nella tua app a una tabella nel tuo database: l'oggetto database ha viste, trigger, processi archiviati, indici, vincoli, ecc. servono anche nomi. Così, ad esempio, potresti trovarti ad accedere solo alle tabelle tramite le viste che in genere sono solo un semplice "seleziona * da foo". Questi possono essere identificati come il nome della tabella con solo un suffisso di "_v" oppure è possibile inserirli in uno schema diverso. Lo scopo di un livello di astrazione così semplice è che può essere espanso quando necessario per consentire modifiche in un ambiente per evitare di influire sull'altro. Ciò non interromperà i suggerimenti di denominazione di cui sopra, solo alcune altre cose di cui tenere conto.


8

Uso i trattini bassi. Ho fatto un progetto Oracle alcuni anni fa, e sembrava che Oracle avesse forzato tutti i nomi dei miei oggetti in lettere maiuscole, il che fa saltare qualsiasi schema di case. Non sono davvero un ragazzo Oracle, quindi forse c'era un modo per aggirare questo di cui non ero a conoscenza, ma mi ha fatto usare i trattini bassi e non sono mai tornato indietro.


2
In 11g e versioni successive, il maiuscolo / minuscolo sembra essere preservato se il nome della tabella è racchiuso tra virgolette doppie. Mettendolo qui per riferimento futuro. So con certezza che anche Postgres lo fa, altri motori db potrebbero non farlo.
John O

8

Poiché la domanda non è specifica per una particolare piattaforma o motore DB, devo dire per la massima portabilità, dovresti sempre usare nomi di tabella in minuscolo.

/ [a-z _] [a-z0-9 _] * / è in realtà l'unico modello di nomi che si traduce perfettamente tra piattaforme diverse. Alfanumerico minuscolo + trattino basso funzioneranno sempre in modo coerente.

Come accennato altrove, i nomi delle relazioni (tabelle) dovrebbero essere singolari: http://www.teamten.com/lawrence/programming/use-singular-nouns-for-database-table-names.html


Sono d'accordo - la sottolineatura ha meno problemi in confronto con Pascal o camel Casing. Specialmente quando i tuoi nomi viaggiano su modelli, dto e frontend alla fine.
Saulius

6

Tendo ad essere d'accordo con le persone che dicono che dipende dalle convenzioni del linguaggio che stai usando (ad esempio PascalCase per C # e snake_case per Ruby).

Mai camelCase, però.


2
Ada: Pascal_Case_With_Underscores
uetoyo

7
Ciò non ha senso quando si desidera accedere alla stessa tabella con due lingue diverse che hanno convenzioni di denominazione diverse.
Daniel W.

5

Dopo aver letto molte altre opinioni, penso che sia molto importante usare le convenzioni di denominazione del linguaggio, la coerenza è più importante delle convenzioni di denominazione solo se sei (e sarai) l'unico sviluppatore dell'applicazione. Se vuoi la leggibilità (che è di enorme importanza) è meglio usare le convenzioni di denominazione per ogni lingua. In MySQL, ad esempio, non suggerisco di utilizzare CamelCase poiché non tutte le piattaforme fanno distinzione tra maiuscole e minuscole. Quindi qui la sottolineatura va meglio.


1
Assolutamente d'accordo!!! Soprattutto con MySql quando lo esegui su Windows tutto diventa da camelCasea camelcase. Quindi avere la custodia del serpente è molto meglio. Inoltre, Modern software however supports any kind of naming schemenon hai alcuna garanzia che scriverai codice per l'ultima versione soft. Soprattutto per il database: l'aggiornamento della versione non è banale se si pensa ai costi di regressione.
Cherry

2

Questi sono i miei cinque centesimi. Sono giunto alla conclusione che se per un progetto vengono utilizzati DB di diversi fornitori, ci sono due modi migliori:

  1. Usa trattini bassi.
  2. Usa la custodia del cammello con le virgolette.

Il motivo è che alcuni database convertiranno tutti i caratteri in maiuscolo e alcuni in minuscolo. Quindi, se ce myTablel' hai lo diventerai MYTABLEo mytablequando lavorerai con DB.


1

Purtroppo non esiste una risposta "migliore" a questa domanda. Come ha affermato @David, la coerenza è molto più importante della convenzione di denominazione.


1

c'è un'ampia variabilità su come separare le parole, quindi dovrai scegliere quello che preferisci; ma allo stesso tempo, sembra che ci sia quasi consenso sul fatto che il nome della tabella debba essere singolare.


1

Le convenzioni di denominazione esistono nell'ambito di una lingua e lingue diverse hanno convenzioni di denominazione diverse.

SQL non fa distinzione tra maiuscole e minuscole per impostazione predefinita; quindi, snake_case è una convenzione ampiamente utilizzata. SQL supporta anche identificatori delimitati; quindi, maiuscole e minuscole in un'opzione, come camelCase (Java, dove campi == colonne) o PascalCase (C #, dove tabelle == classi e colonne == campi). Se il tuo motore DB non può supportare lo standard SQL, questo è il suo problema. Puoi decidere di conviverci o scegliere un altro motore. (E perché C # doveva essere diverso è un punto di aggravamento per quelli di noi che codificano in entrambi.)

Se intendi utilizzare una sola lingua nei tuoi servizi e applicazioni, utilizza le convenzioni di quella lingua a tutti i livelli. Altrimenti, utilizza le convenzioni della lingua più utilizzate nel dominio in cui viene utilizzata quella lingua.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.