Nomenclatura da mesa: Underscore vs Camelcase? namespaces? Singular vs Plural?

91

Tenho lido algumas perguntas / respostas no StackOverflow tentando encontrar a 'melhor', ou devo dizer, a forma mais aceita de nomear tabelas em um banco de dados.

A maioria dos desenvolvedores tende a nomear as tabelas de acordo com a linguagem que requer o banco de dados (JAVA, .NET, PHP, etc). No entanto, sinto que isso não está certo.

A forma como tenho nomeado tabelas até agora está fazendo algo como:

doctorsMain
doctorsProfiles
doctorsPatients
patientsMain
patientsProfiles
patientsAntecedents 

As coisas que estou preocupado são:

  • Legibilidade
  • Identificação rápida do módulo de origem da mesa (médicos || pacientes)
  • Fácil de entender, para evitar confusões.

Eu gostaria de ler qualquer opinião sobre as convenções de nomenclatura. Obrigado.

MarioRicalde
fonte

Respostas:

183

Ser consistente é muito mais importante do que o esquema específico que você usa.

David Oneill
fonte
21
Em outras palavras, sim, muito bem, você identificou alguns esquemas consistentes. Vá em frente!
Phil H
3
+1 para o comentário. Além disso, em uma nota lateral ao esquema de nomenclatura atual, PascalCase é melhor, especialmente se você não usar aliases para as consultas SQL. Desta forma, você pode usar apenas camelcase nos nomes das colunas da tabela e Pascal Case nos nomes das tabelas.
MarioRicalde
3
O caso Pascal / camel para nomes de tabelas pode levar a alguns problemas. Cada tabela terá um arquivo no sistema de arquivos, e alguns deles não diferenciam maiúsculas de minúsculas (por exemplo, OSX).
ismriv
2
@ismriv isso só é um problema se você for inconsistente, se estiver sempre se referindo a tabelas / visões / colunas com o mesmo caso consistente, você não deve ter problemas, não ser preguiçoso ao escrever esses nomes vai lhe render uma grande vantagem mais tarde ao ler. Usar PascalCase para tabelas e camelCase para colunas ajuda a identificar o tipo de um nome à primeira vista e também imita as convenções orientadas a objetos comuns.
TWiStErRob
Eu concordo totalmente que consistência é a chave, mas esta é uma questão antiga e para pessoas que usam plataformas de banco de dados mais recentes, como Redshift e Snowflake, que têm como padrão todos os identificadores de maiúsculas ou minúsculas, eu acrescentaria que é muito importante pensar sobre seu convenções de nomenclatura logo no início. Optar por usar uma convenção de nomenclatura como Camel Case nessas plataformas pode causar algumas dores de cabeça desnecessárias mais tarde, por exemplo, você terá que usar identificadores entre aspas o tempo todo e a resolução de nomes de objetos pode produzir resultados inesperados.
Nathan Griffiths
23

Normalmente, uso PascalCase e as entidades são singulares:

DoctorMain
DoctorProfile
DoctorPatient

Ele imita as convenções de nomenclatura para classes em meu aplicativo, mantendo tudo muito organizado, limpo, consistente e fácil de entender para todos.

Justin Niessner
fonte
3
Sim Sim eu faço. Estou um pouco nebuloso esta manhã. Fazendo a edição ... obrigado.
Justin Niessner
3
Também é conhecido como "CapitalCase".
corsiKa de
4
Nunca ouvi isso ser chamado de "CapitalCase" em meus 30 anos de experiência. Ouvi dizer que ele é mais conhecido como "caso de camelo" e "caso de Pascal" mais recentemente foi usado. Vim aqui para ver por que as pessoas parecem estar usando a caixa de camelo para SQL, quando historicamente não faz distinção entre maiúsculas e minúsculas. Certamente não quero ficar para trás.
Sinthia V
@SinthiaV Eu não sei sobre os outros, mas no nosso caso, como estamos usando um JS ORM (lamentavelmente), as opções foram 1) quebrar a convenção usando camelCase no banco de dados 2) quebrar a convenção usando snake_case no JS 3) map camelCase em JS para snake_case em db. Decidimos sem muito pensamento inicial usar camelCase no banco de dados, e não tem sido tão ruim, mas citar tudo é um pouco complicado.
Andy
@SinthiaV como um comentário inútil que pode ser no contexto da questão SO real, PascalCase não é o mesmo que camelCase. PascalCase coloca em maiúscula a primeira letra de cada palavra (incluindo a primeira de forma crucial), enquanto camelCase só capitaliza as palavras após a primeira. Leitura adicional: medium.com/better-programming/…
curioso
11

Suporta a natureza insensível a maiúsculas e minúsculas Underscores_Scheme. O software moderno, entretanto, suporta qualquer tipo de esquema de nomenclatura. No entanto às vezes alguns bugs desagradáveis, erros ou fator humano podem levar a UPPERCASINGEVERYTHINGque aqueles que selecionaram ambos Pascal_Casee Underscore_Caseesquema vivam com todos os seus nervos em bom estado.

terR0Q
fonte
10

Uma agregação da maioria dos itens acima:

  • não confie no caso no banco de dados
  • não considere o caso ou parte separadora do nome - apenas as palavras
  • use qualquer separador ou caixa que seja o padrão para o seu idioma

Depois, você pode traduzir facilmente (até mesmo automaticamente) nomes entre ambientes.

Mas eu acrescentaria outra consideração: você pode descobrir que existem outros fatores quando você muda de uma classe em seu aplicativo para uma tabela em seu banco de dados: o objeto de banco de dados tem visualizações, gatilhos, procs armazenados, índices, restrições, etc - que também precisa de nomes. Então, por exemplo, você pode se ver acessando apenas tabelas por meio de visualizações que normalmente são apenas um simples "selecionar * de foo". Eles podem ser identificados como o nome da tabela com apenas um sufixo '_v' ou você pode colocá-los em um esquema diferente. O objetivo dessa camada de abstração simples é que ela pode ser expandida quando necessário para permitir alterações em um ambiente para evitar impacto no outro. Isso não quebraria as sugestões de nomenclatura acima - apenas mais algumas coisas a serem consideradas.

KenFar
fonte
8

Eu uso sublinhados. Eu fiz um projeto Oracle há alguns anos, e parecia que a Oracle forçava todos os meus nomes de objeto para maiúsculas, o que meio que estraga qualquer esquema de caixa. Não sou realmente um cara da Oracle, então talvez houvesse uma maneira de contornar isso que eu não sabia, mas me fez usar sublinhados e nunca mais voltei.

Raio
fonte
2
Em 11g e posteriores, a caixa parece ser preservada se o nome da tabela estiver entre aspas duplas. Colocando isso aqui para referência futura. Eu sei com certeza que o Postgres também o faz, mas outros motores de banco de dados não.
John O
8

Como a questão não é específica para uma plataforma ou mecanismo de banco de dados em particular, devo dizer que, para obter o máximo de portabilidade, você deve sempre usar nomes de tabelas em letras minúsculas.

/ [a-z _] [a-z0-9 _] * / é realmente o único padrão de nomes que se traduz perfeitamente entre diferentes plataformas. Alfa-numérico minúsculo + sublinhado sempre funcionam de forma consistente.

Conforme mencionado em outro lugar, os nomes das relações (tabelas) devem ser singulares: http://www.teamten.com/lawrence/programming/use-singular-nouns-for-database-table-names.html

lembrança rica
fonte
Eu concordo - o sublinhado tem menos problemas em comparação com Pascal ou Casing de camelo. Principalmente quando você atribui nomes aos modelos, dto e frontend no final.
Saulius
6

Eu tendo a concordar com as pessoas que dizem que depende das convenções da linguagem que você está usando (por exemplo, PascalCase para C # e snake_case para Ruby).

Mas nunca camelCase.

Mark Rendle
fonte
2
Ada: Pascal_Case_With_Underscores
uetoyo
7
Isso não faz sentido quando você deseja acessar a mesma tabela por dois idiomas diferentes com convenções de nomenclatura diferentes.
Daniel W.
5

Depois de ler muitas outras opiniões, acho muito importante usar as convenções de nomenclatura da linguagem. A consistência é mais importante do que as convenções de nomenclatura apenas se você (e será) o único desenvolvedor do aplicativo. Se você deseja legibilidade (o que é de grande importância), é melhor usar as convenções de nomenclatura para cada idioma. No MySQL, por exemplo, não sugiro o uso de CamelCase, pois nem todas as plataformas diferenciam maiúsculas de minúsculas. Portanto, aqui o sublinhado fica melhor.

Vlad Manuel Mureșan
fonte
1
Concordo absolutamente !!! Especialmente com o MySql quando você o executa no Windows, tudo se torna de camelCasepara camelcase. Portanto, ter um caso de cobra é muito melhor. Também sobre Modern software however supports any kind of naming schemevocê não tem qualquer garantia de que yop escreverá o código para a última versão do software. Especialmente para a atualização da versão do banco de dados, não é trivial quando você pensa sobre os custos de regressão.
Cherry
2

Estes são meus cinco centavos. Cheguei à conclusão de que, se bancos de dados de fornecedores diferentes são usados ​​para um projeto, existem duas melhores maneiras:

  1. Use sublinhados.
  2. Use a caixa de camelo com aspas.

O motivo é que alguns bancos de dados converterão todos os caracteres em maiúsculas e alguns em minúsculas. Então, se você tem myTablevai se tornar MYTABLEou mytablequando vai trabalhar com DB.

Pavel_K
fonte
1

Infelizmente, não há uma "melhor" resposta para essa pergunta. Como @David afirmou, a consistência é muito mais importante do que a convenção de nomenclatura.

Kane
fonte
1

há uma grande variabilidade em como separar palavras, então você terá que escolher o que quiser mais; mas, ao mesmo tempo, parece que há quase um consenso de que o nome da tabela deve ser singular.

Javier
fonte
1

As convenções de nomenclatura existem no escopo de um idioma, e idiomas diferentes têm convenções de nomenclatura diferentes.

SQL não diferencia maiúsculas de minúsculas por padrão; então, snake_case é uma convenção amplamente usada. SQL também oferece suporte a identificadores delimitados; então, caso misto em uma opção, como camelCase (Java, onde campos == colunas) ou PascalCase (C #, onde tabelas == classes e colunas == campos). Se o seu mecanismo de banco de dados não suporta o padrão SQL, esse é o problema. Você pode decidir conviver com isso ou escolher outro motor. (E por que C # tinha que ser diferente é um ponto de agravamento para aqueles de nós que codificam em ambos.)

Se você pretende usar apenas um idioma em seus serviços e aplicativos, use as convenções desse idioma em todas as camadas. Caso contrário, use as convenções mais amplamente usadas do idioma no domínio em que esse idioma é usado.

Chris Golledge
fonte