Dilema de nomeação de tabelas: nomes singulares vs. plurais [fechado]


1466

A Academia afirma que os nomes das tabelas devem ser o singular da entidade na qual eles armazenam atributos.

Não gosto de nenhum T-SQL que exija colchetes em torno de nomes, mas renomei uma Userstabela para singular, sempre condenando aqueles que usam a tabela a usar algumas vezes colchetes.

Minha intuição é que é mais correto permanecer no singular, mas minha intuição também é que colchetes indicam indesejáveis ​​como nomes de colunas com espaços etc.

Devo ficar ou devo ir?


Dup do anterior tabelas de banco de dados , nominais, no plural ou no singular , mas essa chamou mais atenção.
Outis

7
Estou surpreso que mais pessoas não estejam dizendo: é determinado pelo que uma única linha representa. Em um único banco de dados, posso ter uma tabela cujas linhas representem um único widget, e outra que tenha um relacionamento muitos com essa tabela significa que as linhas representam muitos widgets. Não fazer isso perde expressividade.
andygavin

1
Eu só quero acrescentar que, em todas essas discussões, observe que uma tabela não tem a mesma forma que uma classe. Uma tabela é uma coleção de elementos de um tipo específico que pode ser classificado, consultado etc. em propriedades individuais. Uma classe é a estrutura para descrever as propriedades e o comportamento de um tipo específico. Em termos de codificação OO, a representação de fechamento de uma tabela é uma coleção de objetos (independentemente do ORM que você esteja usando). Essa é de longe a resposta mais alta do Google no ranking sobre esse assunto, portanto, embora a pergunta esteja encerrada, a página ainda tem valor.

1
Eu recomendaria a prática comum do ecossistema em que você está trabalhando. Por exemplo: No Node.js, ORMs como Bookshelf.js ou Objection.js são baseados principalmente em "Knex.js". E na documentação "Knex.js" você encontrará nomes de tabelas no plural. Então, eu iria para o plural nesse domínio. Fonte: knexjs.org/#Schema-createTable
Benny Neugebauer

2
Sim eu concordo. Faz sentido ter uma tabela de usuários e chamá-la de "AppUser" ao mesmo tempo, também faz sentido ter uma tabela de regras aplicáveis ​​a um tipo específico de usuário e chamá-la de "UserRules"
Arindam

Respostas:


242

Outros deram respostas muito boas quanto aos "padrões", mas eu só queria acrescentar isso ... É possível que "Usuário" (ou "Usuários") não seja realmente uma descrição completa dos dados contidos na tabela ? Não que você fique louco demais com nomes e especificidades de tabelas, mas talvez algo como "Widget_Users" (onde "Widget" seja o nome do seu aplicativo ou site) seja mais apropriado.


7
Concordo. OrgUsers, AppUsers, qualquer coisa para evitar o uso de uma palavra-chave.
1211 MikeW

7
-1. Os usuários da tabela (e países, idiomas) podem ser usados ​​em poucos aplicativos simultaneamente.
OZ_ 27/09/11

129
A associação do nome do esquema removeria toda a confusão? AppName1.Users, AppName2.Users?
precisa

7
Não concordo com o prefixo da tabela - talvez esse deva ser um esquema? - mas concordo com um "nome mais descritivo". Mesmo algo tão simples como "AppUser" seria suficiente, sem entrar no debate inteiro do espaço para nome.

7
Esta resposta aceita é mais um comentário secundário e não responde à pergunta.
Viliami 01/01

1825

Eu tinha a mesma pergunta e, depois de ler todas as respostas aqui, definitivamente fico com SINGULAR, razões:

Razão 1 (conceito). Você pode pensar em uma bolsa contendo maçãs como "AppleBag", não importa se contém 0, 1 ou um milhão de maçãs, é sempre a mesma bolsa. As tabelas são apenas isso, contêineres, o nome da tabela deve descrever o que ela contém, não a quantidade de dados que ela contém. Além disso, o conceito plural é mais sobre um idioma falado (na verdade, para determinar se existe um ou mais).

Razão 2 . (Conveniência). é mais fácil sair com nomes singulares do que com nomes plurais. Os objetos podem ter plurais irregulares ou não plurais, mas sempre terão um singular (com poucas exceções, como Notícias).

  • Cliente
  • Ordem
  • Do utilizador
  • Status
  • Notícia

Razão 3 . (Estética e Ordem). Especialmente em cenários de detalhes mestres, ele lê melhor, se alinha melhor por nome e tem uma ordem mais lógica (mestre primeiro, detalhe segundo):

  • 1. pedido
  • 2.OrderDetail

Comparado com:

  • 1.OrderDetails
  • 2. pedidos

Razão 4 (Simplicidade). Juntos, nomes de tabelas, chaves primárias, relacionamentos, classes de entidade ... é melhor ter conhecimento de apenas um nome (singular) em vez de dois (classe singular, tabela plural, campo singular, detalhe singular-plural .. .)

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

Depois que você souber que está lidando com "Cliente", pode ter certeza de que usará a mesma palavra para todas as suas necessidades de interação com o banco de dados.

Razão 5 . (Globalização). O mundo está ficando menor, você pode ter uma equipe de diferentes nacionalidades, nem todo mundo tem o inglês como idioma nativo. Seria mais fácil para um programador não nativo de inglês pensar em "Repositório" do que em "Repositórios" ou "Status" em vez de "Status". Ter nomes singulares pode levar a menos erros causados ​​por erros de digitação, economizando tempo por não ter que pensar "é Criança ou Crianças?", Aumentando assim a produtividade.

Razão 6 . (Por que não?). Pode até economizar tempo de gravação, economizar espaço em disco e até fazer com que o teclado do computador dure mais tempo!

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

Você salvou 3 letras, 3 bytes, 3 toques extras no teclado :)

E, finalmente, você pode nomear aqueles que mexem com nomes reservados, como:

  • Usuário> LoginUser, AppUser, SystemUser, CMSUser, ...

Ou use os famosos colchetes [Usuário]


625
Aposto que se você colocar um rótulo em uma gaveta de meias, você chamaria de "Meias".
22630 Chris Ward

73
Definetelly. É difícil conseguir um padrão que funcione para todos e para todos, o importante é que funcione para você. Isso funciona para mim, e aqui expliquei o porquê, mas, novamente, isso é para mim, e acho muito conveniente.
Nestor

451
A questão maior, Chris, é por que você seguiria as convenções de nomeação de banco de dados ao nomear uma gaveta de meias?
Kyle Clegg

83
Esta resposta precisa de mais elogios. Ele discute várias razões práticas que aplico ao motivo pelo qual prefiro nomes singulares. As discussões alternativas sobre linguagem adequada em referência a conjuntos são apenas filosóficas e estão obscurecendo o ponto real. Singular simplesmente funciona melhor.
Jason

298
Eu tenho uma gaveta "Sock" em casa, não uma gaveta "Socks". Se fosse um banco de dados, eu chamaria de tabela "Sock".
usar o seguinte comando

260

Se você usar as ferramentas de mapeamento relacional de objetos ou, no futuro, sugiro o Singular .

Algumas ferramentas como LLBLGen podem corrigir automaticamente nomes plurais como Usuários para Usuário sem alterar o nome da tabela. Por que isso importa? Porque quando ele é mapeado, você deseja que ele se pareça com User.Name em vez de Users.Name ou pior, em algumas das minhas tabelas de bancos de dados antigas que denominam tblUsers.strName, o que é apenas confuso no código.

Minha nova regra geral é julgar como será a aparência depois de convertida em um objeto.

uma tabela que achei que não se encaixa na nova nomeação usada é UsersInRoles. Mas sempre haverá essas poucas exceções e, mesmo nesse caso, parece ótimo como UsersInRoles.Username.


48
Votei para baixo e vou lhe dizer o porquê, porque discordo. ORM por sua natureza, é sobre mapeamento. Toda ferramenta ORM que eu já usei suporta a especificação do nome da tabela a ser usada para uma entidade quando ela é diferente do nome da entidade. Isso é importante porque todo o motivo pelo qual mapeamos para bancos de dados relacionais é para que possamos fazer consultas e relatórios ad-hoc com formas diferentes do nosso modelo de objeto. Caso contrário, todos nós estaríamos apenas usando bancos de dados de objetos / documentos agora.
Joshperry

25
O ORM não deve ditar os nomes dos objetos para os quais eles mapeiam. O ponto do ORM é uma abstração do objeto, concedendo essa flexibilidade.
barrypicker

19
No meu mundo, tento usar nomes consistentes em todo o projeto para evitar perder tempo imaginando se essa instância tem um s no final ou não. O fato de um ORM poder renomear e ser independente não significa que isso esteja ajudando seus colegas desenvolvedores.
John Nicholas

2
Alguns ORM (como muitas ferramentas de programação) têm comportamento padrão que gera implementações sem configuração ... com o ponto de venda da PRODUTIVIDADE. Assim, a criação de uma classe de funcionários, sem mapeamento explícito, geraria uma tabela Employee por padrão
user919426

1
@barrypicker. Os nomes plurais não parecem burros no código ORM. Os plurais também parecem ruins no SQL, especialmente quando se referem a um atributo exclusivo. Quem nunca escreveu seleciona user.id dos usuários? Ou talvez ... dos usuários que deixaram o join no thingy.user_id = user.id ...?
Samuel Danielson

219

Prefiro usar o substantivo não influenciado , que em inglês é singular.

A inflexão do número do nome da tabela causa problemas ortográficos (como muitas das outras respostas mostram), mas optar por fazê-lo porque as tabelas geralmente contêm várias linhas também está semanticamente cheio de furos. Isso é mais óbvio se considerarmos uma linguagem que flexiona substantivos com base em maiúsculas e minúsculas (como a maioria):

Como geralmente fazemos algo com as linhas, por que não colocar o nome no caso acusativo? Se temos uma tabela na qual escrevemos mais do que lemos, por que não colocar o nome em dativo? É uma mesa de alguma coisa, por que não usar o genitivo? Não faríamos isso, porque a tabela é definida como um contêiner abstrato que existe independentemente de seu estado ou uso. Inflingir o substantivo sem uma razão semântica precisa e absoluta é tagarelar.

O uso do substantivo não influenciado é simples, lógico, regular e independente do idioma.


37
Provavelmente, o argumento mais lógico sobre esse assunto que já vi e me alegra por ter passado esse tempo em latim. +1 com certeza.

52
Bem, eu claramente preciso melhorar meu vocabulário.
TJ Biddle #

19
+1 Veja, esses são os tipos de respostas das quais a Internet precisa mais. Provas impecáveis ​​usando vocabulário rico para executar uma lógica perfeita.
OCDev

8
Vou anotar isso na próxima vez que estiver programando em latim. Enquanto isso, os usuários entram na tabela de usuários e os clientes na tabela de clientes.
Caltor 03/08/2015

8
Convencido - não influenciado. Interessante ver que, depois de todo esse tempo, as escolhas populares de "singular" e "plural" estão ambas erradas!
Stuart

126

Que convenção exige que as tabelas tenham nomes singulares? Eu sempre pensei que eram nomes plurais.

Um usuário é adicionado à tabela Usuários.

Este site concorda em:
http://vyaskn.tripod.com/object_naming.htm#Tables

Este site não concorda (mas eu discordo):
http://justinsomnia.org/writings/naming_conventions.html


Como outros já mencionaram: estas são apenas diretrizes. Escolha uma convenção que funcione para você e sua empresa / projeto e atenha-se a ela. Alternar entre singular e plural ou, às vezes, abreviatura de palavras e às vezes não é muito mais agravante.


46
Ao aplicar a teoria de conjuntos a tabelas, qualquer instância do conjunto é representativa do conjunto; portanto, a Apple é um conjunto da Apple, é independente de quantas maçãs existem no conjunto - é uma Apple com muitas instâncias. Um 'saco' de maçãs não se torna um 'saco' quando contém muitas maçãs.
ProfK

89
E se você tiver uma sacola com 5 maçãs dentro? Você chama isso de um saco de maçã? ou um saco de maçãs?
Christopher Mahan

26
Eu acho que a teoria seria que o conjunto se chama Maçãs. Uma maçã singular ainda é "um conjunto de maçãs" - embora um conjunto com uma única instância. Várias maçãs também são um "conjunto de maçãs".
21430 Mark Brackett

26
@ Christopher, se a raison d'être da sacola é para segurar maçãs e somente maçãs, então é uma "sacola de maçã", independentemente de conter 1 maçã, 100 maçãs ou nenhuma maçã.
11268 Ian Ianinninnon

14
@ Ian: Isso porque uma tabela é genérica e pode ser comparada a um contêiner de remessa (pode conter quase tudo, desde caixas de maçã a caixas de motocicletas Harley Davidson). Você diz: um contêiner de carga de laranjas, não um contêiner de carga laranja. Você diz: um contêiner de carga de peças de carro, não um contêiner de carga de peças de carro. Se você criou uma estrutura de dados personalizada destinada a armazenar apenas um tipo específico de dados, como nomes de maçãs, e o nomeou de "kungabogo", poderia ter um kungaboko de maçã. Eu sei o que você pensa, mas pense primeiro em um saco de bolas e entenda a diferença de significado.
Christopher Mahan

79

Que tal isso como um exemplo simples:

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

vs.

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

O SQL no último é mais estranho que o anterior.

Eu voto no singular .


50
Nesse exemplo, sim, mas no sql prático isso nunca seria escrito dessa maneira. Você teria um alias de mesa, de modo que seria mais comoSELECT C.Name, C.Address FROM Customers WHERE Customers.Name > 'def'
Michael Haren

+1, (um ano depois) Você citou um exemplo TERRÍFICO sobre como o singular faz sentido. Este é um debate religioso. Fui transformado no singular há vários anos por um arquiteto de dados há muitos anos mais velho e isso me pareceu certo (depois de exigir muito convencimento para eu mudar).
precisa saber é o seguinte

24
Eu acho que o sql soa melhor no plural. Você não teria nomes de tabelas para cada coluna. Por que gosta tanto de digitar? SELECIONE Nome, Endereço DOS Clientes ONDE Nome> "def" Você está selecionando no pool de clientes onde o nome é maior que def.
precisa

6
Que tal usar um alias / AS para solucionar esse problema? SELECT Customer.Name, Customer.Address FROM Customers AS Customer WHERE Customer.Name> "def"
James Hughes

1
O segundo soa muito melhor, o singular soa como alguém que não sabe falar inglês.
HLGEM 30/08/2013

61

Acredito firmemente que, em um diagrama de relação de entidades, a entidade deve ser refletida com um nome singular, semelhante a um nome de classe singular. Uma vez instanciado, o nome reflete sua instância. Assim, com bancos de dados, a entidade quando transformada em uma tabela (uma coleção de entidades ou registros) é plural. Entidade, Usuário é transformado em Usuários da tabela. Concordo com outras pessoas que sugeriram que talvez o nome Usuário pudesse ser aprimorado para Funcionário ou algo mais aplicável ao seu cenário.

Isso faz mais sentido em uma instrução SQL porque você está selecionando um grupo de registros e, se o nome da tabela for singular, ele não será bem lido.


3
Eu gosto especialmente do comentário da instrução SQL. Usar o singular aqui não parece intuitivo para o leitor.
hochl

2
Excelente ponto sobre o ERD. Eu suspeito que é por isso que, para alguém que vê o mundo através dos olhos do DBA, nomeação singular faz sentido. Suspeito que eles não entendam, como você aponta, a diferença entre uma entidade e uma coleção deles.
William T. Mallard

1
Uma tabela não é uma coleção de registros; uma tabela é uma definição da aparência de um registro. Essa é a desconexão que todo o povo plural / singular parece ter.
rich remer

Não concordo com o comentário da instrução SQL. E se você quiser ingressar no Users.Id
hashtable

1
Uma senhora idosa tem muitos gatos OU mulheres idosas têm gatos. Eu acho que os ERDs são mais agradáveis ​​no plural. E tabela de entidades, as tabelas têm muitas entidades, então novamente eu acho que o plural soa bem.
user3121518

39

Fico com singular para nomes de tabelas e qualquer entidade de programação.

O motivo? O fato de existirem plurais irregulares em inglês, como camundongos ⇒ camundongos e ovelhas ⇒ ovelhas . Então, se eu precisar de uma coleção , apenas uso mouses ou ovelhas e seguirei em frente.

Isso realmente ajuda a pluralidade a se destacar, e posso determinar de maneira fácil e programática como seria a coleção de coisas.

Então, minha regra é: tudo é singular, toda coleção de coisas é singular com um s acrescentado. Também ajuda com ORMs.


7
que tal uma palavra que termina com um 's'? Se você tem uma tabela chamada 'Notícias' (apenas como exemplo), como você chamaria a coleção de notícias? Notícias? Ou você chamaria a tabela de 'Novo'?
Anthony

18
Eu chamaria a tabela NewsItem e uma coleção NewsItems.
Ash Machine

5
E se você tiver que verificar a ortografia de todo o código, caso contrário ele não será compilado;)?
Hamish Grubijan

2
O ORM não deve ditar os nomes dos objetos para os quais eles mapeiam. O ponto do ORM é uma abstração do objeto, concedendo essa flexibilidade.
barrypicker

16
@HamishGrubijan, em seguida, pare de usar o Word para escrever seu código! ;)
Valentino Vranken

37

IMHO, os nomes das tabelas devem ser no plural, como Clientes .

Os nomes de classe devem ser singulares como Customer se mapear para uma linha na tabela Customers .


33

Singular. Não compro nenhum argumento envolvendo o que é mais lógico - toda pessoa pensa que sua preferência é mais lógica. Não importa o que você faça, é uma bagunça, basta escolher uma convenção e cumpri-la. Estamos tentando mapear um idioma com gramática e semântica altamente irregulares (linguagem falada e escrita normal) para uma gramática altamente regular (SQL) com semântica muito específica.

Meu argumento principal é que não penso nas tabelas como um conjunto, mas como relações.

Então, a AppUserrelação diz quais são as entidades AppUsers.

A AppUserGrouprelação me diz quais entidades sãoAppUserGroups

A AppUser_AppUserGrouprelação me diz como AppUserse AppUserGroupsestão relacionados.

A AppUserGroup_AppUserGrouprelação me diz como AppUserGroupse AppUserGroupsestão relacionados (ou seja, grupos membros de grupos).

Em outras palavras, quando penso em entidades e como elas estão relacionadas, penso em relações no singular, mas é claro, quando penso nas entidades em coleções ou conjuntos, as coleções ou conjuntos são plurais.

No meu código, então, e no esquema do banco de dados, eu uso singular. Nas descrições textuais, acabo usando o plural para aumentar a legibilidade - depois uso fontes etc. para distinguir o nome da tabela / relação do plural s.

Eu gosto de pensar nisso como confuso, mas sistemático - e, desse modo, sempre existe um nome gerado sistematicamente para a relação que desejo expressar, o que para mim é muito importante.


1
exatamente. a principal coisa que muitas pessoas não sabem aqui é o que estão nomeando ... você está dando nome a uma relação (um único registro na tabela), não ao conjunto de registros da tabela.
Alexandre Martini

3
Não foi possível discordar mais. 'Selecione * em Usuários com Nome como' J% '' porque estou selecionando todos os usuários em que o nome começa com 'J'. Se seu argumento é que você deseja escrever '... onde User.Name like ...' simplesmente use um alias. Mesmo motivo, digo 'Me dê um par de todas as meias disponíveis'.
Mark A. Donohoe

Se eu fosse esse particular o meu nome de tabela seria sock_pair
Manuel Hernandez

@AlexandreMartini Exactly. Como algumas pessoas que chamam um único registro na tabela de "relação".
Nuno André

31

Eu também usaria os plurais e, com o dilema de usuários mencionado , adotamos a abordagem de colchetes.

Fazemos isso para fornecer uniformidade entre a arquitetura do banco de dados e a arquitetura do aplicativo, com o entendimento subjacente de que a tabela Usuários é uma coleção de valores de Usuário tanto quanto uma coleção Usuários em um artefato de código é uma coleção de objetos Usuário .

O fato de nossa equipe de dados e nossos desenvolvedores falarem a mesma linguagem conceitual (embora nem sempre tenham os mesmos nomes de objetos) facilita a transmissão de idéias entre eles.


8
Eu concordo .. por que a inconsistência entre código e armazenamento? Eu nunca nomearia uma coleção de objetos de usuário "Usuário" no código ... então, por que chamaria uma tabela assim? Isso não faz sentido. Quando leio os argumentos acima, eles estão focados na entidade, não na tabela ... há uma distinção entre o que está na tabela do que a própria tabela em minha mente.
31412 Jason

Como você lida com um nome de tabela como companiesonde outras tabelas têm um campo de referência chamado company_id? Embora esteja escrito corretamente, parece inconsistente para quem é exigente quanto às convenções de nomenclatura de tabelas.
21416 Jake Wilson

1
Lembrando que o singular de companiesé companye que esse ID é uma referência a um item singular. Não deveria nos incomodar no código mais do que nos incomoda em inglês.
David

22

Pessoalmente, prefiro usar nomes plurais para representar um conjunto, apenas "soa" melhor para minha mente relacional.

Neste exato momento, estou usando nomes singulares para definir um modelo de dados para minha empresa, porque a maioria das pessoas no trabalho se sente mais à vontade com ele. Às vezes, você só precisa facilitar a vida de todos, em vez de impor suas preferências pessoais. (foi assim que acabei neste tópico, para obter uma confirmação sobre qual deveria ser a "melhor prática" para nomear tabelas)

Depois de ler todas as discussões neste tópico, cheguei a uma conclusão:

Gosto das minhas panquecas com mel, não importa qual é o sabor favorito de todos. Mas se eu estiver cozinhando para outras pessoas, tentarei lhes servir o que eles gostam.


Não é aconselhável usar essa convenção no mundo do modelo relacional, especialmente quando você descreve a relação entre objetos, por exemplo, "Cada equipe pode ter apenas um treinador principal e muitos treinadores secundários", que é descrito: Equipe-> MainCoach, Equipe - >> SecondaryCoach
noonex

16

Singular. Eu chamaria uma matriz contendo um monte de objetos de representação de linha de usuário 'users', mas a tabela é 'the user table'. Pensar na tabela como nada além do conjunto de linhas que ela contém está errado, IMO; a tabela são os metadados e o conjunto de linhas é hierarquicamente anexado à tabela, não é a própria tabela.

Eu uso ORMs o tempo todo, é claro, e isso ajuda o código ORM escrito com nomes de tabelas plurais parecer estúpido.


Para cada um dele, eu acho. Uma tabela de banco de dados relacional é, por definição, um cabeçalho (ou seja, metadados nomeando os atributos) e um conjunto de tuplas que correspondem ao cabeçalho. Você pode se concentrar nos metadados, enquanto outras pessoas se concentram nas tuplas. :-) #
31130 Bill Karwin

Ei, User_Table é um nome que eu gosto! :)
Camilo Martin

3
O ORM não deve ditar os nomes dos objetos para os quais eles mapeiam. O ponto do ORM é uma abstração do objeto, concedendo essa flexibilidade.
barrypicker

1
Eu olho para ele desta maneira. Se você criar uma matriz / lista / dicionário de qualquer coisa no código, minha aposta é que você o nomeie com o nome plural de tudo o que ele contém. Se você estiver usando um ORM para abstrair seu banco de dados, as tabelas são representadas com algum tipo de coleção. Por que você as trataria de maneira diferente? Usar nomes singulares pode parecer bom, mas você está sempre lutando contra o seu instinto de que uma tabela contém muitas das mesmas coisas, assim como uma coleção de códigos. Por que a inconsistência?
31412 Jason

@ Jason: Por favor, comparar e contrastar a forma como estas coisas leia-se: 1) $db->user->row(27), $db->product->rows->where(something) 2) $db->users->row(27), $db->products->rows->where(something).
caos

16

Na verdade, sempre achei que era uma convenção popular usar nomes de tabelas plurais. Até este ponto, eu sempre usei o plural.

Eu posso entender o argumento para nomes de tabelas singulares, mas para mim o plural faz mais sentido. Um nome de tabela geralmente descreve o que a tabela contém. Em um banco de dados normalizado, cada tabela contém conjuntos específicos de dados. Cada linha é uma entidade e a tabela contém muitas entidades. Assim, a forma plural para o nome da tabela.

Uma tabela de carros teria o nome carros e cada linha é um carro. Admito que especificar a tabela junto com o campo de uma table.fieldmaneira é a melhor prática e que ter nomes de tabelas singulares é mais legível. No entanto, nos dois exemplos a seguir, o primeiro faz mais sentido:

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

Honestamente, vou repensar minha posição sobre o assunto e confiaria nas convenções reais usadas pela organização para a qual estou desenvolvendo. No entanto, acho que para minhas convenções pessoais, vou ficar com nomes de tabelas plurais. Para mim, faz mais sentido.


9
Também não é esta a convenção no RoR? Nomes plurais para tabelas e Singular para classes ORM? Faz muito sentido para mim. A tabela é chamada de "carros" porque possui muitas instâncias de "carro" e a classe é chamada de "Carro" porque conterá uma instância de um carro !!
Sap

@Sap Uma pequena correção da última parte da sua frase - A classe "Car" é um DataType Abstrato que representa um carro da vida real. A capacidade de manter uma instância ou múltiplos depende de como é usada.
ASGs

vamos enfrentá-lo, tabela caré uma definição da estrutura de um único carro. Se você olhar para a estrutura da tabela, ela cuspirá basicamente "id int, string de cores etc": além disso, digamos que você tenha uma tabela car_vendor(ou seria sua versão plural cars_vendor) com a chave estrangeira cars_id?! que merda é essa? não é car_id preciso me fazer pensar. Singular é o preferido por mim
Toskan

4
Eu realmente gosto desta resposta! Deixe-me explicar. Se a coleção é care você deseja que tudo carseja blueresultado, deve ser algo parecido tire, mirror, engine. E então está ficando confuso porque todos os resultados são partsde a car. Assim, o nome da tabela deve ser carparts(ou car_parts, CarPartso que você quiser)
arnoudhgz

Qualquer designer de banco de dados que imponha nomes de tabelas singulares está basicamente declarando guerra contra qualquer desenvolvedor de aplicativos Ruby on Rails que possa entrar em contato com esse banco de dados no futuro. A insistência estrita de Rail em palavras singulares para classes e nomes pluralizados para tabelas permite um comportamento poderoso em muitas gemas dentro do ecossistema de Ruby. Portanto, mesmo se você acha que o singular soa melhor, por uma questão de compatibilidade, você deve seguir o plural. Eu imagino que isso também seja válido para muitos outros mapeadores relacionais de objetos.
Kelsey Hannan

15

Não gosto de nomes de tabelas no plural porque alguns substantivos em inglês não são contáveis ​​(água, sopa, dinheiro) ou o significado muda quando você o torna contável (frango vs galinha; carne vs pássaro). Também não gosto de usar abreviações para o nome da tabela ou o nome da coluna porque isso adiciona uma inclinação extra à curva de aprendizado já íngreme.

Ironicamente, posso abrir Useruma exceção e chamá-la Userspor causa de USER (Transac-SQL) , porque também não gosto de usar colchetes em volta das tabelas se não for necessário.

Também gosto de nomear todas as colunas de identificação como Id, não ChickenIdou ChickensId(o que os caras do plural fazem sobre isso?).

Tudo isso porque eu não tenho o devido respeito pelos sistemas de banco de dados, estou apenas reaplicando o conhecimento de um truque-pônei das convenções de nomenclatura OO, como o Java por hábito e preguiça. Eu gostaria que houvesse um suporte IDE melhor para SQL complicado.


8
Nós, homens plurais, ou nomeie a coluna 'id' como 'id' como você, ou 'singular_id'. Acredito que as tabelas devam ser plurais (pense nelas como matrizes), mas os nomes das colunas devem ser singulares (atributos de um único elemento).
M4 # 03

plu_ral / PluRal para nomes de tabelas, singular_id / singularId para chaves primárias.
hochl

14

Executamos padrões semelhantes, quando o script exigimos [] em torno de nomes e, quando apropriado, qualificadores de esquema - principalmente protege suas apostas contra futuras capturas de nomes pela sintaxe SQL.

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

Isso salvou nossas almas no passado - alguns de nossos sistemas de banco de dados foram executados há mais de 10 anos entre o SQL 6.0 e o SQL 2005 - muito além do tempo de vida útil pretendido.


Parece autoflagelação ritualística. Alguma coisa desse tipo aconteceu ainda?
precisa

13

Tabelas: plural

Vários usuários estão listados na tabela de usuários.

Modelos: singular

Um usuário singular pode ser selecionado na tabela de usuários.

Controladores: plural

http://myapp.com/users listaria vários usuários.

Essa é a minha opinião de qualquer maneira.


1
Mais próximo da minha opinião, mas a minha é que o armazenamento de vários usuários da tabela é realmente incidental e que qualquer usuário singular é representado pela tabela, ou melhor, pela relação que é um conjunto de tuplas representando uma entidade Usuário.
ProfK

Eu acho que tenho a tendência de concordar com isso. A única coisa que me confunde é por que os modelos devem ser singulares? Somente se o modelo estiver relacionado apenas a um único usuário. Se eu estivesse consultando o banco de dados para obter todos os usuários, precisaria acessar o modelo? Não faz sentido para uma instância singular buscar todos os registros, por exemplo: $ user-> get_all () // não faz sentido
PM7Temp

12

Sou fã de nomes de tabelas singulares, pois eles facilitam a leitura dos diagramas de ER usando a sintaxe CASE, mas ao ler essas respostas, sinto que nunca percebi muito bem? Eu pessoalmente amo isso. Há uma boa visão geral com exemplos de quão legíveis seus modelos podem ser quando você usa nomes de tabelas singulares, adiciona verbos de ação aos seus relacionamentos e forma boas frases para todos os relacionamentos. É um pouco exagerado para um banco de dados de 20 tabelas, mas se você tiver um banco de dados com centenas de tabelas e um design complexo, como seus desenvolvedores o entenderão sem um bom diagrama legível?

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

Quanto ao prefixo de tabelas e visualizações, eu odeio essa prática. Não dê informações a uma pessoa antes de fornecer informações possivelmente ruins. Qualquer pessoa que esteja navegando em um banco de dados para objetos pode distinguir facilmente uma tabela a partir de uma visualização, mas se eu tiver uma tabela chamada tblUsers, por alguma razão eu decidirei reestruturar no futuro em duas tabelas, com uma visualização unificando-as para não quebrar o código antigo Agora tenho uma visão chamada tblUsers. Nesse ponto, tenho duas opções desagradáveis, deixo uma visualização nomeada com um prefixo tbl que pode confundir alguns desenvolvedores ou forçar outra camada, camada intermediária ou aplicativo, a ser reescrita para fazer referência à minha nova estrutura ou nome de viewUsers. Isso nega uma grande parte do valor das opiniões IMHO.


1
Bom exemplo de uma armadilha de prefixar nomes de objetos com um qualificador 'type'!
precisa saber é o seguinte

12

O sistema tables/viewsdo próprio servidor ( SYSCAT.TABLES, dbo.sysindexes, ALL_TABLES, information_schema.columns, etc.) são quase sempre plural. Acho que, por uma questão de consistência, eu seguiria a liderança deles.


A Microsoft é o que eles são por razões comerciais primeiro (e geralmente razões antiéticas), por razões lógicas. Minha única razão para segui-los seria que eles são o grande gorila e todo mundo segue por esse caminho. Quando tenho uma escolha, escolho o outro caminho.
precisa

1
Deve-se notar que isso information_schemafaz parte da ISO / IEC 9075-11, o padrão SQL. E sim, ele usa nomes de tabelas / visualizações plurais.
Paulo Freitas

10

Se olharmos para as MS SQL Server'stabelas do sistema, seus nomes como atribuídos pela Microsoft estão plural.

As tabelas de sistema do Oracle são nomeadas singular. Embora alguns deles sejam plurais. A Oracle recomenda o plural para nomes de tabela definidos pelo usuário. Não faz muito sentido que eles recomendem uma coisa e sigam outra. O fato de os arquitetos dessas duas gigantes de software terem nomeado suas tabelas usando convenções diferentes também não faz muito sentido ... Afinal, o que são esses caras ... PhDs?

Lembro-me na academia, a recomendação era singular.

Por exemplo, quando dizemos:

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

talvez b / c cada um IDseja selecionado em uma única linha específica ...?


1
A Microsoft é o que eles são por razões comerciais primeiro (e geralmente razões antiéticas), por razões lógicas por último. Minha única razão para segui-los seria que eles são o grande gorila e todo mundo segue por esse caminho. Quando tenho uma escolha, escolho o outro caminho.
precisa

Duas coisas. Primeiro, você normalmente não usaria os nomes das tabelas e escreveria 'select ID FROM OrderHeaders WHERE Reference =' ABC123 'porque você está' Selecionando todos os IDs dos OrderHeaders onde algo é verdadeiro ', mas se você tivesse que usar nomes de tabelas devido a um junte-se ou o que quer, você usaria um alias como assim ... 'selecionar OrderHeader.ID dE OrderHeaders como OrderHeader ONDE OrderHeader.Reference = 'ABC123'
Mark A. Donohoe

9

Isso pode ser um pouco redundante, mas eu sugeriria ser cauteloso. Não necessariamente é ruim renomear tabelas, mas a padronização é exatamente isso; um padrão - esse banco de dados já pode estar "padronizado", por mais que seja ruim :) - eu sugeriria consistência como um objetivo melhor, pois esse banco de dados já existe e, presumivelmente, consiste em mais do que apenas 2 tabelas.

A menos que você possa padronizar todo o banco de dados, ou pelo menos esteja planejando trabalhar para esse fim, suspeito que os nomes das tabelas sejam apenas a ponta do iceberg e que esteja concentrado na tarefa em questão, suportando a dor de objetos mal nomeados. seu melhor interesse -

A consistência prática às vezes é o melhor padrão ... :)

my2cents ---


9

Alternativas possíveis:

  • Renomeie a tabela SystemUser
  • Use colchetes
  • Mantenha os nomes das tabelas no plural.

A IMO usando colchetes é tecnicamente a abordagem mais segura, embora seja um pouco complicada. Na IMO, são seis de uma, meia dúzia da outra, e sua solução realmente se resume à preferência pessoal / da equipe.


2
Eu gosto da ideia do seu 'prefixo', mas chamaria SystemUser.
ProfK

9

Minha opinião é sobre semântica, dependendo de como você define seu contêiner. Por exemplo, um "saco de maçãs" ou simplesmente "maçãs" ou um "saco de maçãs" ou "maçã".

Exemplo: uma tabela "faculdade" pode conter 0 ou mais faculdades uma tabela de "faculdades" pode conter 0 ou mais faculdades

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

Minha conclusão é que qualquer um está bem, mas você precisa definir como você (ou as pessoas que interagem com ele) se aproximará quando se referir às tabelas; "tabela de machado" ou uma "tabela de xs"


8

Como outros já mencionaram aqui, as convenções devem ser uma ferramenta para aumentar a facilidade de uso e a legibilidade. Não como um grilhão ou um clube para torturar desenvolvedores.

Dito isto, minha preferência pessoal é usar nomes singulares para tabelas e colunas. Isso provavelmente vem do meu background de programação. Os nomes das classes geralmente são singulares, a menos que sejam algum tipo de coleção. Em minha mente, estou armazenando ou lendo registros individuais na tabela em questão, tão singular faz sentido para mim.

Essa prática também me permite reservar nomes de tabelas plurais para aqueles que armazenam relacionamentos muitos-para-muitos entre meus objetos.

Também tento evitar palavras reservadas nos nomes das minhas tabelas e colunas. No caso em questão, faz mais sentido contrariar a convenção singular para Usuários, para evitar a necessidade de encapsular uma tabela que use a palavra reservada Usuário.

Eu gosto de usar prefixos de maneira limitada (tbl para nomes de tabelas, sp_ para nomes de proc, etc.), embora muitos acreditem que isso acrescente confusão. Também prefiro os nomes do CamelBack a sublinhados, porque sempre acabo pressionando o + em vez de _ ao digitar o nome. Muitos outros discordam.

Aqui está outro bom link para diretrizes de convenção de nomenclatura: http://www.xaprb.com/blog/2008/10/26/the-power-of-a-good-sql-naming-convention/

Lembre-se de que o fator mais importante em sua convenção é que faz sentido para as pessoas que interagem com o banco de dados em questão. Não existe um "anel para governar todos" quando se trata de convenções de nomenclatura.


18
Ignorando os horrores da notação húngara. Nunca, nunca, nunca use sp_ na frente de procedimentos armazenados, porque o MS-SQL usa isso para procedimentos armazenados do sistema e os trata de maneira especial. Como sp_ são armazenados na tabela mestre, o MS-SQL sempre será o primeiro, mesmo que você qualifique o local.
Will Dieterich

8

Eu acho que usar o singular é o que aprendemos na universidade. Mas, ao mesmo tempo, você poderia argumentar que, diferentemente da programação orientada a objetos, uma tabela não é uma instância de seus registros.

Acho que estou me inclinando a favor do singular no momento por causa de irregularidades plurais em inglês. Em alemão, é ainda pior devido a formas plurais consistentes - às vezes você não pode dizer se uma palavra é plural ou não sem o artigo de especificação à sua frente (der / die / das). E nas línguas chinesas não há formas plurais de qualquer maneira.


Na universidade, sou ensinado no plural para tabelas, também tenho um livro aqui, terceira edição do DB Management dos anos 90, as tabelas são singulares; enquanto eu também tenho uma cópia atualizada, 11e, nomes singulares e alguns abreviados, enquanto a seção XML usa o plural. \ n Mas se você verificar o conteúdo real das seções RDBMS, ele ainda será literalmente o mesmo texto, com algumas imagens tendo obtido um lifting facial. \ n A "lista de verificação de modelagem de dados" não declara nada no plural versus no singular, apenas que as entidades devem mapear apenas para um único objeto, provavelmente o que elas estavam tentando aplicar nos livros.
Marco

8

Uma vez eu usei "Cara" na tabela Usuário - o mesmo número curto de caracteres, sem conflito com palavras-chave, ainda uma referência a um ser humano genérico. Se eu não estivesse preocupado com as cabeças abafadas que poderiam ver o código, eu teria mantido dessa maneira.


8

Eu sempre usei o singular simplesmente porque foi o que me ensinaram. No entanto, ao criar um novo esquema recentemente, pela primeira vez em muito tempo, decidi ativamente manter essa convenção simplesmente porque ... é mais curto. Adicionar um 's' ao final de cada nome de tabela parece tão inútil para mim quanto adicionar 'tbl_' na frente de cada um.


7

Eu sempre pensei que era uma convenção idiota. Eu uso nomes de tabelas no plural.

(Acredito que o racional por trás dessa política é que torna mais fácil para os geradores de código ORM produzir classes de objeto e coleção, pois é mais fácil produzir um nome plural a partir de um nome singular do que vice-versa)


11
Essa convenção faz parte da teoria relacional muito, muito tempo antes da ORM existir.
ProfK

1
O ORM não deve ditar os nomes dos objetos para os quais eles mapeiam. O ponto do ORM é uma abstração do objeto, concedendo essa flexibilidade.
barrypicker

7

Eu só uso substantivos para os nomes das minhas tabelas que estão escritos da mesma forma, sejam eles singulares ou plurais:

alce peixe veado aeronaves você calças shorts óculos tesoura espécies prole


6

Não vi isso claramente articulado em nenhuma das respostas anteriores. Muitos programadores não têm uma definição formal em mente ao trabalhar com tabelas. Frequentemente, nos comunicamos intuitivamente em termos de "registros" ou "linhas". No entanto, com algumas exceções para relações desnormalizadas, as tabelas geralmente são projetadas para que a relação entre os atributos não-chave e a chave constitua uma função teórica definida.

Uma função pode ser definida como um subconjunto de um produto cruzado entre dois conjuntos, no qual cada elemento do conjunto de chaves ocorre no máximo uma vez no mapeamento. Portanto, a terminologia que surge dessa perspectiva tende a ser singular. Vê-se a mesma convenção singular (ou pelo menos não-plural) em outras teorias matemáticas e computacionais envolvendo funções (álgebra e cálculo lambda, por exemplo).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.