Dilemma di denominazione delle tabelle: nomi singolari e plurali [chiuso]


1467

Secondo il mondo accademico, i nomi delle tabelle dovrebbero essere il singolare dell'entità di cui memorizzano gli attributi.

Non mi piace qualsiasi T-SQL che richiede parentesi quadre attorno ai nomi, ma ho rinominato una Userstabella in singolare, condannando per sempre coloro che usano la tabella a volte devono usare parentesi.

La mia sensazione è che sia più corretto stare con il singolare, ma la mia sensazione è anche che le parentesi indicano indesiderabili come nomi di colonne con spazi in esse ecc.

Dovrei restare o dovrei andare?


Dup della precedente denominazione delle tabelle del database, plurale o singolare , ma questa ha ottenuto maggiore attenzione.
uscita

7
Sono sorpreso che più persone non lo dicano: è determinato da ciò che rappresenta una singola riga. In un singolo database potrei avere una tabella le cui righe rappresentano un singolo widget singolo e un altro che ha una relazione uno-a-molti con quella tabella significa che le righe rappresentano molti widget. Non farlo perde espressività.
Andygavin,

1
Voglio solo aggiungere che in tutte queste discussioni, tieni presente che una tabella non può in alcun modo modellare o formare la stessa di una classe. Una tabella è una raccolta di elementi di un tipo specifico che possono essere ordinati, interrogati, ecc. Su singole proprietà. Una classe è il framework per descrivere le proprietà e il comportamento di un tipo specifico. In termini di codifica OO, la rappresentazione chiusa in una tabella è una raccolta di oggetti (indipendentemente dall'ORM che si sta utilizzando). Questa è di gran lunga la risposta di Google più alta in classifica su questo argomento, quindi sebbene la domanda sia chiusa, la pagina ha ancora valore.

1
Vorrei scegliere la pratica comune dell'ecosistema in cui stai lavorando. Ad esempio: in Node.js gli ORM come Bookshelf.js o Objection.js si basano principalmente su "Knex.js". E nella documentazione "Knex.js" troverai i nomi delle tabelle al plurale. Quindi vorrei andare al plurale in quel dominio. Fonte: knexjs.org/#Schema-createTable
Benny Neugebauer

2
Si, sono d'accordo. Ha senso avere una tabella di utenti e chiamarla "AppUser" allo stesso tempo ha anche senso avere una tabella di regole applicabile a un particolare tipo di utente e chiamarla "UserRules"
Arindam

Risposte:


242

Altri hanno dato risposte abbastanza buone per quanto riguarda gli "standard", ma volevo solo aggiungere questo ... È possibile che "Utente" (o "Utenti") non sia in realtà una descrizione completa dei dati contenuti nella tabella ? Non che dovresti impazzire troppo con i nomi delle tabelle e la specificità, ma forse qualcosa come "Widget_Users" (dove "Widget" è il nome della tua applicazione o del tuo sito Web) sarebbe più appropriato.


7
Sono d'accordo. OrgUser, AppUser, qualsiasi cosa per evitare di usare una parola chiave.
MikeW,

7
-1. Gli utenti delle tabelle (e Paesi, lingue) possono essere utilizzati contemporaneamente in alcune applicazioni.
OZ_

129
Associare il nome dello schema non eliminerebbe tutta la confusione? AppName1.Users, AppName2.Users?
Zo ha il

7
Non sono d'accordo con il prefisso della tabella - quello dovrebbe forse essere uno schema? - ma concordo con un "nome più descrittivo". Anche qualcosa di semplice come "AppUser" sarebbe sufficiente, senza entrare nell'intero dibattito sullo spazio dei nomi.

7
Questa risposta accettata è più un commento collaterale e non risponde alla domanda.
Viliami,

1826

Ho avuto la stessa domanda, e dopo aver letto tutte le risposte qui rimango sicuramente con SINGULAR, ragioni:

Motivo 1 (concetto). Puoi pensare a un sacchetto contenente mele come "AppleBag", non importa se contiene 0, 1 o un milione di mele, è sempre lo stesso sacchetto. Le tabelle sono solo questo, i contenitori, il nome della tabella deve descrivere ciò che contiene, non quanti dati contiene. Inoltre, il concetto plurale riguarda più una lingua parlata (in realtà per determinare se ne esiste una o più).

Motivo 2 . (Convenienza). è più facile venire fuori con nomi singolari, piuttosto che con nomi plurali. Gli oggetti possono avere plurali irregolari o non essere affatto plurali, ma ne avranno sempre uno singolare (con poche eccezioni come Notizie).

  • Cliente
  • Ordine
  • Utente
  • Stato
  • notizia

Motivo 3 . (Estetica e Ordine). Soprattutto negli scenari di dettaglio principale, questo si legge meglio, si allinea meglio per nome e ha un ordine più logico (Master prima, Dettaglio secondi):

  • 1.Order
  • 2.OrderDetail

Rispetto a:

  • 1.OrderDetails
  • 2.Orders

Motivo 4 (Semplicità). Metti tutti insieme, nomi di tabella, chiavi primarie, relazioni, classi di entità ... è meglio essere consapevoli di un solo nome (singolare) invece di due (classe singolare, tabella plurale, campo singolare, dettaglio principale singolare-plurale .. .)

  • Customer
  • Customer.CustomerID
  • CustomerAddress
  • public Class Customer {...}
  • SELECT FROM Customer WHERE CustomerID = 100

Una volta che sai di avere a che fare con "Cliente", puoi essere sicuro di usare la stessa parola per tutte le esigenze di interazione del database.

Motivo 5 . (Globalizzazione). Il mondo sta diventando più piccolo, potresti avere un team di diverse nazionalità, non tutti hanno l'inglese come lingua madre. Sarebbe più facile per un programmatore di madrelingua inglese pensare a "Repository" piuttosto che a "Repository", o "Status" anziché "Status". Avere nomi singolari può portare a un minor numero di errori causati da errori di battitura, risparmiare tempo non dovendo pensare "è Child o Children?", Migliorando quindi la produttività.

Motivo 6 . (Perchè no?). Può anche farti risparmiare tempo in scrittura, risparmiare spazio su disco e persino prolungare la durata della tastiera del tuo computer!

  • SELECT Customer.CustomerName FROM Customer WHERE Customer.CustomerID = 100
  • SELECT Customers.CustomerName FROM Customers WHERE Customers.CustomerID = 100

Hai salvato 3 lettere, 3 byte, 3 ulteriori hit da tastiera :)

E infine, puoi nominare quelli che si incasinano con nomi riservati come:

  • Utente> LoginUser, AppUser, SystemUser, CMSUerer, ...

Oppure usa le famigerate parentesi quadre [Utente]


625
Scommetto che se metti un'etichetta su un cassetto per calzini la chiameresti "Calze".
Chris Ward,

73
Definetelly. È difficile ottenere uno standard che funzioni per tutti e per tutti, importante è che funzioni per te. Questo funziona per me, e qui ho spiegato perché, ma ancora una volta, è per me, e lo trovo molto conveniente.
Nestor,

451
La domanda più grande, Chris, è perché dovresti seguire le convenzioni di denominazione del database quando dai un nome a un cassetto dei calzini?
Kyle Clegg,

83
Questa risposta ha bisogno di più elogi. Discute un sacco di ragioni pratiche che applico al perché preferisco i nomi singolari. Le discussioni alternative sul linguaggio corretto in riferimento agli insiemi sono solo filosofiche e stanno oscurando il punto reale. Singular funziona meglio.
Jason,

298
Ho un cassetto "Sock" a casa, non un cassetto "Socks". Se fosse un database, lo definirei la tabella "Sock".
jlembke,

260

Se usi gli strumenti di mappatura relazionale degli oggetti o lo farò in futuro ti suggerisco Singolare .

Alcuni strumenti come LLBLGen possono correggere automaticamente nomi plurali come Users to User senza cambiare il nome della tabella stessa. Perché è importante? Perché quando è mappato, vuoi che assomigli a User.Name anziché a Users.Name o peggio da alcune delle mie vecchie tabelle di database che nominano tblUsers.strName che è solo confuso nel codice.

La mia nuova regola empirica è giudicare come apparirà una volta che è stato convertito in un oggetto.

una tabella che ho trovato che non si adatta alla nuova denominazione che uso è UsersInRoles. Ma ci saranno sempre quelle poche eccezioni e anche in questo caso sembra UserInRoles.Username.


48
Ho votato verso il basso e ti dirò perché, perché non sono d'accordo. ORM per sua natura riguarda la mappatura. Ogni strumento ORM che abbia mai usato supporta la specifica del nome della tabella da utilizzare per un'entità quando è diversa dal nome dell'entità. Questo è importante perché l'intero motivo che mappiamo ai database relazionali è che possiamo facilmente fare query e report ad hoc con forme diverse rispetto al nostro modello a oggetti. Altrimenti ormai dovremmo usare tutti i database di oggetti / documenti.
joshperry,

25
L'ORM non dovrebbe dettare i nomi degli oggetti su cui mappano. Il punto di ORM è un'astrazione dell'oggetto, garantendo questa flessibilità.
barrypicker,

19
Nel mio mondo cerco di usare nomi coerenti in tutto il progetto per evitare di perdere tempo a chiedermi se questa istanza ha una s alla fine o no. Il fatto che un ORM possa rinominare ed essere indipendente non significa che farlo aiuti i tuoi colleghi sviluppatori.
John Nicholas,

2
Alcuni ORM (come molti strumenti di programmazione) hanno un comportamento predefinito che genera implementazioni senza configurazione ... con il punto di forza di PRODUTTIVITÀ. Quindi la creazione di una classe Employee, senza mapping esplicito, genererebbe una tabella Employee per impostazione predefinita
user919426

1
@barrypicker. I nomi plurali non sembrano solo stupidi nel codice ORM. I plurali hanno un aspetto negativo anche in SQL, specialmente quando si fa riferimento a un attributo univoco. Chi non ha mai scritto selezionare user.id dagli utenti? O forse ... dagli utenti lasciati unisci su thingy.user_id = user.id ...?
Samuel Danielson,

219

Preferisco usare il nome non infetto, che in inglese sembra essere singolare.

L'inflessione del numero del nome della tabella causa problemi ortografici (come mostrano molte altre risposte), ma scegliere di farlo perché le tabelle di solito contengono più righe è anche semanticamente pieno di buchi. Questo è più ovvio se consideriamo un linguaggio che flette i nomi in base al caso (come la maggior parte fa):

Dato che di solito facciamo qualcosa con le righe, perché non inserire il nome nel caso accusativo? Se abbiamo una tabella a cui scriviamo più di quanto leggiamo, perché non mettere il nome in dativo? È una tabella di qualcosa, perché non usare il genitivo? Non lo faremmo, perché la tabella è definita come un contenitore astratto che esiste indipendentemente dal suo stato o utilizzo. Flettere il nome senza una ragione semantica precisa e assoluta è un borbottio.

L'uso del nome non infetto è semplice, logico, regolare e indipendente dalla lingua.


37
Probabilmente l'argomento più logico su questo argomento che abbia mai visto, e mi rende felice di aver trascorso quel tempo in latino. +1 di sicuro.

52
Beh, ho chiaramente bisogno di rafforzare il mio vocabolario.
TJ Biddle,

19
+1 Vedi, questi sono i tipi di risposte di cui Internet ha più bisogno. Prove impeccabili che utilizzano un ricco vocabolario per eseguire una logica perfetta.
OCDev,

8
Ne prenderò nota la prossima volta che sto programmando in latino. Nel frattempo gli utenti entreranno nella tabella degli utenti e i clienti nella tabella dei clienti.
Caltor,

8
Convinto - non infetto lo è. Interessante vedere che dopo tutto questo tempo, le scelte popolari di "singolare" e "plurale" sono entrambe sbagliate!
Stuart,

126

Quale convenzione richiede che le tabelle abbiano nomi singolari? Ho sempre pensato che fossero nomi plurali.

Un utente viene aggiunto alla tabella Users.

Questo sito è d'accordo:
http://vyaskn.tripod.com/object_naming.htm#Tables

Questo sito non è d'accordo (ma non sono d'accordo):
http://justinsomnia.org/writings/naming_conventions.html


Come altri hanno già detto: queste sono solo linee guida. Scegli una convenzione che funzioni per te e per la tua azienda / progetto e mantienila. Il passaggio tra parole singolari e plurali o talvolta abbreviate e talvolta no è molto più aggravante.


46
Quando si applica la teoria dei set alle tabelle, qualsiasi istanza nel set è rappresentativa del set, quindi Apple è un set Apple, è agnostico di quante mele ci siano nel set - è una Apple con molte istanze. Una "borsa" di mele non diventa una "borsa" quando contiene molte mele.
ProfK,

89
E se hai una borsa con 5 mele dentro? Lo chiami un sacchetto di mele? o un sacco di mele?
Christopher Mahan,

26
Penso che la teoria sarebbe che il set si chiama Mele. Una mela singolare è ancora "un insieme di mele" - sebbene, un insieme con una singola istanza. Le mele multiple sono anche un "set di mele".
Mark Brackett,

26
@Christopher, se la ragion d'essere della borsa è contenere mele e solo mele, allora è una "borsa di mele", indipendentemente dal fatto che contenga 1 mela, 100 mele o nessuna mela.
Ian Mackinnon,

14
@ Ian: Questo perché un tavolo è generico e può essere paragonato a un container (può contenere quasi tutto, dalle casse di mele alle casse di motociclette Harley Davidson). Tu dici: un container di arance, non un container arancione. Tu dici: un container di parti di automobili, non un container di parti di automobili. Se hai creato una struttura di dati personalizzata destinata a contenere solo un tipo specifico di dati, come i nomi delle mele, e l'hai chiamato "kungabogo", allora potresti avere un kungaboko di mele. So cosa stai pensando, ma prima pensa a una sacca di palline e capisco la differenza di significato.
Christopher Mahan,

79

Che ne dici di questo come un semplice esempio:

SELECT Customer.Name, Customer.Address FROM Customer WHERE Customer.Name > "def"

vs.

SELECT Customers.Name, Customers.Address FROM Customers WHERE Customers.Name > "def"

L'SQL in quest'ultimo sembra più strano del primo.

Voto per singolare .


50
In questo esempio, sì, ma in sql pratico non sarebbe mai stato scritto in quel modo. Avresti un alias da tavolo, quindi sarebbe più simile aSELECT C.Name, C.Address FROM Customers WHERE Customers.Name > 'def'
Michael Haren,

+1, (un anno dopo) Hai citato un esempio TERRIFICO su come ha senso il singolare. Questo è in qualche modo un dibattito religioso. Sono stato trasformato nel singolare diversi anni fa da un architetto di dati molti anni più vecchio e mi è sembrato giusto per me (dopo aver richiesto molto convincente per il mio passaggio).
Chris Adragna,

24
Penso che il sql suoni meglio al plurale. Non avresti i nomi delle tabelle per ogni colonna, perché ti piace scrivere così tanto. SELEZIONA Nome, Indirizzo DA CLIENTI DOVE Nome> "def" Stai selezionando dal pool di clienti in cui il nome è maggiore di def.
Jamiegs

6
Che ne dici di usare un alias / AS per aggirare quel problema? SELEZIONA Customer.Name, Customer.Address DA Clienti COME Cliente DOVE Customer.Name> "def"
James Hughes

1
Il secondo suona molto meglio, suoni singolari come qualcuno che non sa parlare inglese.
HLGEM,

61

Sono fermamente convinto che in un diagramma di relazione tra entità, l'entità dovrebbe essere riflessa con un nome singolare, simile al nome di una classe che è singolare. Una volta istanziato, il nome riflette la sua istanza. Quindi, con i database, l'entità quando viene trasformata in una tabella (una raccolta di entità o record) è plurale. Entità, l'utente viene trasformato in utenti tabella. Concordo con gli altri che hanno suggerito che il nome Utente potrebbe essere migliorato come Dipendente o qualcosa di più applicabile al tuo scenario.

Questo ha quindi più senso in un'istruzione SQL perché stai selezionando da un gruppo di record e se il nome della tabella è singolare, non viene letto bene.


3
Mi piace soprattutto il commento dell'istruzione SQL. L'uso singolare qui non è intuitivo per il lettore.
Hochl,

2
Punto eccellente sull'ERD. Ho il sospetto che questo sia il motivo per cui, per qualcuno che vede il mondo attraverso gli occhi DBA, la denominazione singolare ha senso. Ho il sospetto che non ottengano, come dici tu, la differenza tra un'entità e una loro raccolta.
William T. Mallard,

1
Una tabella non è una raccolta di record; una tabella è una definizione di come appare un record. Questa è la disconnessione che sembra avere tutta la gente plurale / singolare.
rich remer

Non sono d'accordo con il commento dell'istruzione SQL. Che cosa succede se si desidera partecipare contro Users.Id
hashtable

1
Un vecchio ha molti gatti O vecchi ha gatti. Penso che gli ERD siano più belli al plurale. E la tabella delle entità, le tabelle hanno molte entità, quindi ritengo che il plurale suoni bene.
user3121518

39

Mi attengo al singolare per i nomi delle tabelle e qualsiasi entità di programmazione.

La ragione? Il fatto che ci siano plurali irregolari in inglese come topo ⇒ topi e pecore ⇒ pecore . Quindi, se ho bisogno di una collezione , uso solo topi o pecore e vado avanti.

Aiuta davvero la spiccata pluralità e posso facilmente e programmaticamente determinare come sarebbe la raccolta di cose.

Quindi, la mia regola è: tutto è singolare, ogni raccolta di cose è singolare con una s aggiunta. Aiuta anche con ORM.


7
che dire di una parola che termina con una 's'? Se hai una tabella chiamata "Notizie" (solo come esempio), come chiameresti la raccolta di notizie? Newss? O chiameresti il ​​tavolo "Nuovo"?
Anthony,

18
Vorrei chiamare il tavolo NewsItem e una raccolta NewsItems.
Ash Machine,

5
E se dovessi controllare l'ortografia di tutto il codice altrimenti non verrà compilato;)?
Hamish Grubijan,

2
L'ORM non dovrebbe dettare i nomi degli oggetti su cui mappano. Il punto di ORM è un'astrazione dell'oggetto, garantendo questa flessibilità.
barrypicker,

16
@HamishGrubijan quindi smetti di usare Word per scrivere il tuo codice! ;)
Valentino Vranken l'

37

IMHO, i nomi delle tabelle dovrebbero essere plurali come i clienti .

I nomi delle classi devono essere singolari come quelli del Cliente se si associano a una riga nella tabella Clienti .


33

Singolare. Non compro nessun argomento che sia il più logico: ogni persona pensa che la propria preferenza sia il più logico. Non importa quello che fai è un casino, basta scegliere una convenzione e attenersi ad essa. Stiamo cercando di mappare una lingua con grammatica e semantica altamente irregolari (lingua parlata e scritta normale) su una grammatica altamente regolare (SQL) con semantica molto specifica.

Il mio argomento principale è che non penso alle tabelle come un insieme ma come relazioni.

Quindi, la AppUserrelazione dice quali entità sono AppUsers.

La AppUserGrouprelazione mi dice quali entità sonoAppUserGroups

La AppUser_AppUserGrouprelazione mi dice come l' AppUserse AppUserGroupssono legati.

La AppUserGroup_AppUserGrouprelazione mi dice come AppUserGroupse AppUserGroupssono correlati (cioè gruppi membri di gruppi).

In altre parole, quando penso alle entità e al modo in cui sono correlate, penso alle relazioni in modo singolare, ma ovviamente quando penso alle entità in raccolte o set, le raccolte o i set sono plurali.

Nel mio codice, quindi, e nello schema del database, uso singolare. Nelle descrizioni testuali, finisco per usare il plurale per una maggiore leggibilità, quindi uso i caratteri ecc. Per distinguere il nome della tabella / relazione dal plurale.

Mi piace pensarlo come disordinato, ma sistematico - e in questo modo c'è sempre un nome generato sistematicamente per la relazione che desidero esprimere, che per me è molto importante.


1
Esattamente. la cosa principale che molte persone non sono consapevoli qui è ciò che stanno nominando ... stai dando il nome a una relazione (un singolo record nella tabella), non l'insieme di record nella tabella.
Alexandre Martini,

3
Non potrei essere più in disaccordo. 'Seleziona * da Utenti dove Nome come' J% '' perché sto selezionando tutti gli utenti in cui il nome inizia con 'J'. Se il tuo argomento è che vuoi scrivere "... dove User.Name come ...", usa semplicemente un alias. Stesso motivo per cui dico "Dammi un paio di tutti i calzini disponibili".
Mark A. Donohoe,

Se fossi quel particolare il mio nome da tavolo sarebbe sock_pair
Manuel Hernandez,

@AlexandreMartini Exactly. Come alcune persone che chiamano un singolo record nella tabella "relazione".
Nuno André,

31

Vorrei anche andare con i plurali e con il suddetto dilemma degli utenti , adottiamo l'approccio del bracketing quadrato.

Facciamo questo per fornire l'uniformità tra l'architettura del database e l'architettura dell'applicazione, con la comprensione che la tabella Users è una raccolta di valori utente , così come una raccolta Users in un artefatto di codice è una raccolta di oggetti User .

Avere il nostro team di dati e i nostri sviluppatori che parlano lo stesso linguaggio concettuale (anche se non sempre gli stessi nomi di oggetti) rende più semplice trasmettere idee tra di loro.


8
Sono d'accordo .. perché l'incoerenza tra codice e memoria? Non nominerei mai una raccolta di oggetti utente "Utente" nel codice ... quindi perché dovrei chiamare una tabella così? Non ha senso. Quando leggo gli argomenti sopra a riguardo, si stanno concentrando sull'entità, non sulla tabella ... c'è una distinzione tra ciò che è nella tabella rispetto alla tabella stessa nella mia mente.
Jason,

Come gestisci un nome di tabella come companiesdove altre tabelle hanno un campo di riferimento chiamato company_id? Sebbene sia scritto correttamente, sembra incoerente per coloro che sono esigenti riguardo alle convenzioni di denominazione delle tabelle.
Jake Wilson,

1
Ricordando che il singolare di companiesè companye che questo id è un riferimento a un singolo oggetto. Non dovrebbe darci fastidio nel codice più di quanto non ci dia fastidio in inglese.
David,

22

Personalmente preferisco usare nomi plurali per rappresentare un insieme, semplicemente "suona" meglio alla mia mente relazionale.

In questo preciso momento sto usando nomi singolari per definire un modello di dati per la mia azienda, perché la maggior parte delle persone al lavoro si sente più a suo agio con esso. A volte devi solo rendere la vita più facile a tutti invece di imporre le tue preferenze personali. (è così che sono finito in questo thread, per ottenere una conferma su quella che dovrebbe essere la "best practice" per la denominazione delle tabelle)

Dopo aver letto tutte le discussioni in questa discussione, ho raggiunto una conclusione:

Mi piacciono le mie frittelle con miele, indipendentemente dal sapore preferito di tutti. Ma se sto cucinando per altre persone, cercherò di servire loro qualcosa che gli piace.


Non è saggio usare tale convenzione nel mondo dei modelli relazionali, specialmente quando descrivi la relazione tra oggetti, ad esempio "Ogni squadra può avere solo un allenatore principale e molti allenatori secondari", che è descritto: Squadra-> MainCoach, Squadra - >> SecondaryCoach
noonex

16

Singolare. Definirei un array contenente un gruppo di oggetti di rappresentazione delle righe utente "utenti", ma la tabella è "la tabella utente". Pensare alla tabella come nient'altro che l'insieme delle righe che contiene è sbagliato, IMO; la tabella è i metadati e l'insieme di righe è gerarchicamente collegato alla tabella, non è la tabella stessa.

Uso gli ORM per tutto il tempo, ovviamente, e aiuta il fatto che il codice ORM scritto con nomi di tabelle plurali sia stupido.


A ciascuno il suo, immagino. Una tabella di database relazionale è per definizione un'intestazione (ovvero metadati che denominano gli attributi) e un insieme di tuple corrispondenti all'intestazione. Puoi concentrarti sui metadati, mentre altre persone si concentrano sulle tuple. :-)
Bill Karwin,

Ehi, User_Table è un nome che mi piace! :)
Camilo Martin,

3
L'ORM non dovrebbe dettare i nomi degli oggetti su cui mappano. Il punto di ORM è un'astrazione dell'oggetto, garantendo questa flessibilità.
barrypicker,

1
Lo guardo in questo modo .. se crei un array / elenco / dizionario di qualsiasi cosa nel codice, la mia scommessa è che lo chiami con il nome plurale di qualunque cosa detenga. Se stai usando un ORM per astrarre il tuo database, le tabelle sono rappresentate con una sorta di raccolta, quindi perché le tratteresti in modo diverso? Usare nomi singolari può sembrare buono, ma stai sempre combattendo il tuo istinto che una tabella contiene molte delle stesse cose, proprio come fa una raccolta in codice. Perché l'incoerenza?
Jason,

@ Jason: Si prega di confrontare e contrapporre il modo in cui queste cose lette: 1) $db->user->row(27), $db->product->rows->where(something) 2) $db->users->row(27), $db->products->rows->where(something).
caos,

16

In realtà ho sempre pensato che fosse una convenzione popolare usare nomi di tabelle plurali. Fino a questo punto ho sempre usato il plurale.

Riesco a capire l'argomento per nomi di tabelle singolari, ma per me il plurale ha più senso. Un nome di tabella solitamente descrive cosa contiene la tabella. In un database normalizzato, ogni tabella contiene set specifici di dati. Ogni riga è un'entità e la tabella contiene molte entità. Quindi la forma plurale per il nome della tabella.

Un tavolo di macchine avrebbe il nome di macchine e ogni fila è una macchina. Devo ammettere che specificare la tabella insieme al campo in un table.fieldcerto modo è la migliore pratica e che avere nomi di tabella singolari è più leggibile. Tuttavia, nei seguenti due esempi, il primo ha più senso:

SELECT * FROM cars WHERE color='blue'
SELECT * FROM car WHERE color='blue'

Onestamente, ripenserò la mia posizione sulla questione e farei affidamento sulle convenzioni effettivamente utilizzate dall'organizzazione per cui sto sviluppando. Tuttavia, penso che per le mie convenzioni personali, rimarrò con nomi di tabella plurale. Per me ha più senso.


9
Non è questa la convenzione anche nel RoR? Nomi plurali per table e Singular for ORM class? Ha molto senso per me. La tabella si chiama "auto" perché ha molte istanze di "auto" e la classe si chiama "auto" perché conterrà un'istanza di un'auto !!
Sap,

@Sap Una piccola correzione dell'ultima parte della frase - La classe "Car" è un DataType astratto che rappresenta un'auto nella vita reale. Se conterrà un'istanza o multipli dipende da come viene utilizzato.
chiede il

ammettiamolo, la tabella carè una definizione della struttura di una singola auto. Se guardi la struttura della tabella, sputerà inoltre sostanzialmente "id int, stringa di colori ecc": dire che hai una tabella car_vendor(o per la tua versione plurale sarebbe cars_vendor) con la chiave esterna cars_id?! cos'è quella stupida merda? non car_id c'è bisogno di farmi pensare. Singular è fortemente preferito da me
Toskan,

4
Mi piace molto questa risposta! Lasciatemi spiegare. Se la collezione è care vuoi tutto da quello carche è blueil risultato dovrebbe essere qualcosa del genere tire, mirror, engine. E poi sta diventando confuso perché tutti i risultati provengono partsda a car. Quindi il nome della tabella dovrebbe essere carparts(o car_parts, CarPartscome preferisci)
arnoudhgz,

Qualsiasi progettista di database che impone nomi di tabelle singolari sta fondamentalmente dichiarando guerra agli sviluppatori di app Ruby on Rails che potrebbero entrare in contatto con quel database in futuro. La rigorosa insistenza di Rail su parole singolari per le classi e nomi pluralizzati per le tabelle, consente un comportamento molto potente all'interno di molte gemme all'interno dell'ecosistema di Ruby. Quindi, anche se pensi che i suoni singolari siano migliori, per motivi di compatibilità dovresti attenersi al plurale. Immagino che ciò valga anche per molti altri mappatori relazionali di oggetti.
Kelsey Hannan,

15

Non mi piacciono i nomi di tabella plurale perché alcuni sostantivi in ​​inglese non sono numerabili (acqua, zuppa, denaro) o il significato cambia quando lo rendi numerabile (pollo vs pollo; carne vs uccello). Non mi piace anche usare le abbreviazioni per il nome della tabella o della colonna, perché in questo modo si aggiunge una pendenza extra alla curva di apprendimento già ripida.

Ironia della sorte, potrei fare Userun'eccezione e chiamarla a Userscausa di USER (Transac-SQL) , perché anche a me non piace usare le parentesi attorno alle tabelle se non devo.

Mi piace anche nominare tutte le colonne ID come Id, no ChickenIdo ChickensId(cosa fanno i plurali al riguardo?).

Tutto questo perché non ho il giusto rispetto per i sistemi di database, sto solo riapplicando la conoscenza di un pony da convenzioni di denominazione OO come Java per abitudine e pigrizia. Vorrei che ci fosse un miglior supporto IDE per SQL complicato.


8
Noi plurali nominiamo la colonna 'id' 'id' come voi, o 'singular_id'. Credo che le tabelle debbano essere al plurale (pensale come matrici), ma i nomi delle colonne dovrebbero essere singolari (attributi di un singolo elemento).
Aprire il

plu_ral / PluRal per i nomi delle tabelle, singular_id / singularId per le chiavi primarie.
hochl,

14

Eseguiamo standard simili, quando gli script richiedono [] attorno ai nomi e laddove appropriato qualificatori di schemi - principalmente copre le tue scommesse contro future prese di nomi dalla sintassi SQL.

SELECT [Name] FROM [dbo].[Customer] WHERE [Location] = 'WA'

Ciò ha salvato le nostre anime in passato - alcuni dei nostri sistemi di database hanno funzionato per oltre 10 anni da SQL 6.0 a SQL 2005 - ben oltre la durata prevista.


Sembra auto-flagellazione rituale. È mai successo qualcosa del genere?
Kjetil S.

13

Tabelle: plurale

Più utenti sono elencati nella tabella degli utenti.

Modelli: singolare

Un singolo utente può essere selezionato dalla tabella degli utenti.

Controller: plurale

http://myapp.com/users elencherebbe più utenti.

Questa è comunque la mia opinione.


1
Più vicino al mio punto di vista, ma il mio è che l'archiviazione della tabella di più utenti è in realtà fortuita e che ogni singolo utente è rappresentato dalla tabella, o meglio la relazione che è un insieme di tuple che rappresentano un'entità utente.
ProfK,

Penso di essere d'accordo con questo. L'unica cosa che mi confonde è perché i modelli dovrebbero essere singolari? Solo se il modello riguarda solo un singolo utente. Se stavo interrogando il db per ottenere tutti gli utenti, avrei bisogno di accedere al modello? Non ha senso che un'istanza singolare recuperi tutti i record, ad esempio: $ user-> get_all () // non ha senso
PM7Temp

12

Sono un fan dei nomi di tabelle singolari in quanto rendono più semplici da leggere i miei diagrammi ER utilizzando la sintassi CASE, ma leggendo queste risposte ho la sensazione che non abbia mai preso molto bene? Personalmente lo adoro. C'è una buona panoramica con esempi di quanto possano essere leggibili i tuoi modelli quando usi nomi di tabelle singolari, aggiungi verbi di azione alle tue relazioni e formi buone frasi per ogni relazione. È un po 'eccessivo per un database di 20 tabelle, ma se si dispone di un DB con centinaia di tabelle e un design complesso, come potranno mai capirlo gli sviluppatori senza un buon diagramma leggibile?

http://www.aisintl.com/case/method.html

Per quanto riguarda il prefisso di tabelle e viste, odio assolutamente questa pratica. Non dare a nessuna persona alcuna informazione prima di dargli probabilmente cattive informazioni. Chiunque sfoglia un db alla ricerca di oggetti può facilmente distinguere una tabella da una vista, ma se ho una tabella denominata tblUsers che per qualche motivo decido di ristrutturare in futuro in due tabelle, con una vista unificante per evitare di rompere il vecchio codice Ora ho una vista chiamata tblUsers. A questo punto mi rimangono due opzioni poco interessanti, lascia una vista nominata con un prefisso tbl che può confondere alcuni sviluppatori, o forzare un altro livello, livello intermedio o applicazione da riscrivere per fare riferimento alla mia nuova struttura o agli utenti con nome. Ciò nega gran parte del valore delle visualizzazioni IMHO.


1
Un buon esempio di trappola del prefisso dei nomi degli oggetti con un qualificatore 'type'!
Kenny Evitt,

12

Il sistema tables/viewsdel server stesso ( SYSCAT.TABLES, dbo.sysindexes, ALL_TABLES, information_schema.columns, etc.) sono quasi sempre al plurale. Immagino che per coerenza seguirò il loro esempio.


Microsoft è ciò che è per prima cosa per ragioni di business (e spesso per ragioni non etiche), infine per ragioni logiche. La mia unica ragione per seguirli sarebbe che sono il grande gorilla e tutti gli altri vanno così. Quando ho una scelta, scelgo l'altro modo.
Bruce Patin,

1
Va notato che information_schemafa parte della norma ISO / IEC 9075-11, lo standard SQL. E sì, usa nomi di tabelle / viste plurali.
Paulo Freitas,

10

Se guardiamo le MS SQL Server'stabelle di sistema, i loro nomi sono assegnati da Microsoft plural.

Le tabelle di sistema di Oracle sono nominate singular. Sebbene alcuni di essi siano plurali. Oracle consiglia il plurale per i nomi di tabella definiti dall'utente. Non ha molto senso che raccomandino una cosa e ne seguano un'altra. Che gli architetti di questi due giganti del software abbiano chiamato i loro tavoli usando convenzioni diverse, non ha molto senso neanche ... Dopotutto, cosa sono questi ragazzi ... dottorandi?

Ricordo che in ambito accademico la raccomandazione era singolare.

Ad esempio, quando diciamo:

select OrderHeader.ID FROM OrderHeader WHERE OrderHeader.Reference = 'ABC123'

forse b / c ognuno IDè selezionato da una particolare riga singola ...?


1
Microsoft è ciò che è per prima cosa per ragioni di business (e spesso per ragioni non etiche), per ultimo le ragioni logiche. La mia unica ragione per seguirli sarebbe che sono il grande gorilla e tutti gli altri vanno così. Quando ho una scelta, scelgo l'altro modo.
Bruce Patin,

Due cose. Uno, normalmente non useresti i nomi delle tabelle e scriveresti 'seleziona ID DA OrderHeaders DOVE Riferimento =' ABC123 'perché stai' selezionando tutti gli ID da OrderHeaders dove qualcosa è vero 'ma se dovessi usare i nomi delle tabelle a causa di un aderire o qualsiasi altra cosa, useresti un alias in questo modo ... 'seleziona OrderHeader.ID FROM OrderHeaders come OrderHeader DOVE OrderHeader.Reference =' ABC123 '
Mark A. Donohoe

9

Questo potrebbe essere un po 'ridondante, ma suggerirei di essere cauto. Non è necessariamente una cosa negativa rinominare le tabelle, ma la standardizzazione è proprio questo; uno standard - questo database potrebbe già essere "standardizzato", per quanto malamente :) - Suggerirei che la coerenza sia un obiettivo migliore dato che questo database esiste già e presumibilmente è composto da più di 2 sole tabelle.

A meno che tu non possa standardizzare l'intero database, o almeno non stai pianificando di lavorare a tal fine, sospetto che i nomi delle tabelle siano solo la punta dell'iceberg e che si concentrino sul compito a portata di mano, sopportando il dolore di oggetti mal nominati, potrebbe essere in il tuo miglior interesse -

La coerenza pratica a volte è lo standard migliore ... :)

my2cents ---


9

Possibili alternative:

  • Rinominare la tabella SystemUser
  • Usa le parentesi
  • Mantieni i nomi di tabella plurale.

L'utilizzo delle parentesi da parte dell'IMO è tecnicamente l'approccio più sicuro, sebbene sia un po 'complicato. L'IMO è il 6 dell'uno, mezza dozzina dell'altro e la tua soluzione si riduce davvero alle preferenze personali / del team.


2
Mi piace la tua idea di "prefisso", ma la chiamerei SystemUser.
ProfK,

9

La mia opinione è in semantica a seconda di come definisci il tuo contenitore. Ad esempio, un "sacchetto di mele" o semplicemente "mele" o un "sacchetto di mele" o "mela".

Esempio: una tabella "college" può contenere 0 o più college una tabella di "college" può contenere 0 o più college

a "student" table can contain 0 or more students 
a table of "students" can contain 0 or more students.

La mia conclusione è che o va bene, ma devi definire come approverai te (o le persone che interagiscono con esso) quando ti riferisci alle tabelle; "ax table" o "table of xs"


8

Come altri hanno già detto qui, le convenzioni dovrebbero essere uno strumento da aggiungere alla facilità d'uso e alla leggibilità. Non come una catena o un club per torturare gli sviluppatori.

Detto questo, la mia preferenza personale è quella di usare nomi singolari sia per le tabelle che per le colonne. Questo probabilmente deriva dal mio background di programmazione. I nomi delle classi sono generalmente singolari a meno che non siano una sorta di raccolta. Nella mia mente sto memorizzando o leggendo singoli record nella tabella in questione, quindi singolare ha senso per me.

Questa pratica mi consente anche di riservare nomi di tabelle plurali a coloro che memorizzano relazioni molti-a-molti tra i miei oggetti.

Cerco anche di evitare parole riservate nei nomi delle mie tabelle e colonne. Nel caso in questione qui ha più senso andare in contrasto con la singolare convenzione per gli utenti per evitare la necessità di incapsulare una tabella che utilizza la parola riservata dell'utente.

Mi piace usare i prefissi in modo limitato (tbl per i nomi delle tabelle, sp_ per i nomi proc, ecc.), Anche se molti credono che questo aggiunga disordine. Preferisco anche i nomi CamelBack ai caratteri di sottolineatura perché finisco sempre per premere + invece di _ quando si digita il nome. Molti altri non sono d'accordo.

Ecco un altro buon link per le linee guida della convenzione di denominazione: http://www.xaprb.com/blog/2008/10/26/the-power-of-a-good-sql-naming-convention/

Ricorda che il fattore più importante nella tua convenzione è che ha senso per le persone che interagiscono con il database in questione. Non esiste un "One Ring to Rule Them All" quando si tratta di convenzioni di denominazione.


18
Ignorando gli orrori della notazione ungherese. Mai, mai, mai usare sp_ davanti a stored procedure perché MS-SQL lo utilizza per le stored procedure di sistema e le considera speciali. Poiché sp_ sono memorizzati nella tabella principale, MS-SQL è sempre il primo, anche se si qualifica la posizione.
Will Dieterich l'

8

Penso che usare il singolare sia ciò che ci è stato insegnato all'università. Ma allo stesso tempo si poteva sostenere che, diversamente dalla programmazione orientata agli oggetti, una tabella non è un'istanza dei suoi record.

Penso di essere a favore del singolare al momento a causa di irregolarità plurali in inglese. In tedesco è ancora peggio a causa della mancanza di forme plurali coerenti - a volte non si può dire se una parola è plurale o meno senza l'articolo che le specifica di fronte (der / die / das). E nelle lingue cinesi non ci sono comunque forme plurali.


All'università mi viene insegnato il plurale per i tavoli, qui ho anche un libro, la terza edizione del DB management degli anni '90, i tavoli sono singolari; mentre ho anche una copia aggiornata, 11e, singolare e alcuni nomi abbreviati, mentre la sezione XML utilizza il plurale. \ n Ma se controlli il contenuto effettivo delle sezioni RDBMS, è letteralmente sempre lo stesso testo con alcune immagini che hanno ottenuto un lifting. \ n L '"elenco di controllo per la modellazione dei dati" non indica nulla al plurale o al singolare, solo che le entità dovrebbero mappare solo un singolo oggetto, questo è probabilmente ciò che stavano cercando di imporre nei libri.
Marco,

8

Una volta ho usato "Amico" per la tabella Utente - stesso numero breve di caratteri, nessun conflitto con le parole chiave, ancora un riferimento a un essere umano generico. Se non fossi preoccupato per le teste chiuse che potrebbero vedere il codice, lo avrei mantenuto in quel modo.


8

Ho sempre usato il singolare semplicemente perché è quello che mi è stato insegnato. Tuttavia, durante la creazione di un nuovo schema di recente, per la prima volta dopo tanto tempo, ho deciso attivamente di mantenere questa convenzione semplicemente perché ... è più breve. Aggiungere una 's' alla fine di ogni nome di tabella mi sembra inutile come aggiungere 'tbl_' davanti a ognuno.


7

Ho sempre pensato che fosse una stupida convenzione. Uso nomi di tabelle plurali.

(Credo che la logica alla base di tale politica sia quella di rendere più semplice per i generatori di codice ORM la produzione di classi di oggetti e raccolte, poiché è più semplice produrre un nome plurale da un nome singolare piuttosto che viceversa)


11
Questa convenzione è stata parte della teoria relazionale molto, molto prima che l'ORM esistesse.
ProfK,

1
L'ORM non dovrebbe dettare i nomi degli oggetti su cui mappano. Il punto di ORM è un'astrazione dell'oggetto, garantendo questa flessibilità.
barrypicker,

7

Uso solo nomi per i nomi delle mie tabelle che sono scritti allo stesso modo, sia singolari che plurali:

pesce alce cervo aereo pantaloni pantaloncini occhiali forbici specie prole


6

Non l'ho visto chiaramente articolato in nessuna delle risposte precedenti. Molti programmatori non hanno in mente una definizione formale quando lavorano con le tabelle. Spesso comunichiamo in modo intuitivo in termini di "record" o "righe". Tuttavia, con alcune eccezioni per le relazioni denormalizzate, le tabelle sono generalmente progettate in modo tale che la relazione tra gli attributi non chiave e la chiave costituisca una funzione teorica definita.

Una funzione può essere definita come un sottoinsieme di un prodotto incrociato tra due insiemi, in cui ciascun elemento dell'insieme di chiavi si verifica al massimo una volta nella mappatura. Quindi la terminologia derivante da quella prospettiva tende ad essere singolare. Si vede la stessa convenzione singolare (o almeno non plurale) attraverso altre teorie matematiche e computazionali che coinvolgono funzioni (algebra e calcolo lambda per esempio).

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.