Sempre que eu projeto um banco de dados, sempre me pergunto se existe uma melhor maneira de nomear um item no meu banco de dados. Muitas vezes, faço as seguintes perguntas:
- Os nomes das tabelas devem ser plurais?
- Os nomes das colunas devem ser singulares?
- Devo prefixar tabelas ou colunas?
- Devo usar algum caso para nomear itens?
Existem diretrizes recomendadas para nomear itens em um banco de dados?
Respostas:
Eu recomendo verificar os bancos de dados de exemplo do SQL Server da Microsoft: https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks
O exemplo AdventureWorks usa uma convenção de nomenclatura muito clara e consistente que usa nomes de esquema para a organização de objetos de banco de dados.
fonte
Resposta tardia aqui, mas em resumo:
Elaboração:
(1) O que você deve fazer. Há muito poucas coisas que você deve fazer de uma certa maneira, todas as vezes, mas há algumas.
2) O que você provavelmente deve fazer.
(3) O que você deve considerar.
fonte
CustomerID
é a chave primária daCustomer
tabela ou uma chave estrangeira em outra tabela. É uma questão menor. Por que você gostaria de usar nomes ruins comoc
?CustomerID = Customer.ID
é muito claro que você vê que está ingressando em uma chave estrangeira com uma chave primária; não é redundante, pois os dois lados são duas coisas diferentes. A nomeação de caracteres únicos é uma prática ruim do IMO.Ok, já que estamos avaliando a opinião:
Eu acredito que os nomes das tabelas devem ser plurais. As tabelas são uma coleção (uma tabela) de entidades. Cada linha representa uma única entidade e a tabela representa a coleção. Então, eu chamaria uma tabela de entidades Pessoa de Pessoas (ou Pessoas, o que for necessário).
Para aqueles que gostam de ver "nomes de entidades" singulares em consultas, é para isso que eu usaria aliases de tabela:
Um pouco como os LINQs "de pessoa em pessoa, selecione person.Name".
Quanto a 2, 3 e 4, concordo com o @Lars.
fonte
Eu trabalho em uma equipe de suporte de banco de dados com três DBAs e nossas opções consideradas são:
Usamos nomes singulares para tabelas. As tabelas tendem a ser prefixadas com o nome do sistema (ou seu acrônimo). Isso é útil se o sistema complexo, pois você pode alterar o prefixo para agrupar as tabelas logicamente (por exemplo, reg_customer, reg_booking e regadmin_limits).
Para os campos, esperamos que os nomes dos campos incluam o prefixo / acrônimo da tabela (ou seja, cust_address1) e também preferimos o uso de um conjunto padrão de sufixos (_id para o PK, _cd para "code", _nm para "name ", _nb para" número ", _dt para" Data ").
O nome do campo da chave estrangeira deve ser o mesmo que o campo da chave primária.
ie
Ao desenvolver um novo projeto, recomendo que você escreva todos os nomes, prefixos e acrônimos de entidades preferenciais e forneça este documento aos seus desenvolvedores. Então, quando eles decidem criar uma nova tabela, eles podem se referir ao documento em vez de "adivinhar" como a tabela e os campos devem ser chamados.
fonte
Está bem. Thats my $ 0.02
fonte
Também sou a favor de uma convenção de nomenclatura no estilo ISO / IEC 11179, observando que elas são diretrizes e não prescritivas.
Consulte Nome do elemento de dados na Wikipedia :
"As tabelas são coleções de entidades e seguem as diretrizes de nomenclatura das coleções. Idealmente, um nome coletivo é usado: por exemplo, pessoal. O plural também está correto: funcionários. Os nomes incorretos incluem: funcionário, tblEmployee e EmployeeTable."
Como sempre, há exceções às regras, por exemplo, uma tabela que sempre possui exatamente uma linha pode ser melhor com um nome singular, como uma tabela de configuração. E a consistência é de extrema importância: verifique se você compra uma convenção e, se houver, siga-a; se você não gostar, faça um caso de negócios para que ele seja alterado, em vez de ser o único patrulheiro.
fonte
Eu ouço o argumento o tempo todo de que a pluralização ou não de uma mesa é uma questão de gosto pessoal e não há práticas recomendadas. Eu não acredito que isso seja verdade, especialmente como programador em oposição a um DBA. Tanto quanto sei, não há motivos legítimos para pluralizar um nome de tabela além de "Isso só faz sentido para mim porque é uma coleção de objetos", enquanto há ganhos legítimos no código por ter nomes de tabelas singulares. Por exemplo:
Evita bugs e erros causados por ambiguidades plurais. Os programadores não são exatamente conhecidos por sua experiência em ortografia, e a pluralização de algumas palavras é confusa. Por exemplo, a palavra plural termina em 'es' ou apenas 's'? São pessoas ou pessoas? Quando você trabalha em um projeto com grandes equipes, isso pode se tornar um problema. Por exemplo, uma instância em que um membro da equipe usa o método incorreto para pluralizar uma tabela que ele cria. No momento em que interajo com essa tabela, ela é usada em todo o código ao qual não tenho acesso ou levaria muito tempo para corrigir. O resultado é que devo me lembrar de escrever a tabela incorretamente toda vez que a uso. Algo muito parecido com isso aconteceu comigo. Quanto mais fácil você facilitar a utilização consistente e fácil de todos os membros da equipe, corrija nomes de tabelas sem erros ou tenha que procurar nomes de tabelas o tempo todo, melhor. A versão singular é muito mais fácil de manusear em um ambiente de equipe.
Se você usa a versão singular de um nome de tabela E prefixa a chave primária com o nome da tabela, agora você tem a vantagem de determinar facilmente um nome de tabela a partir de uma chave primária ou vice-versa apenas por código. Você pode receber uma variável com um nome de tabela, concatenar "Id" até o final, e agora você tem a chave primária da tabela via código, sem precisar fazer uma consulta adicional. Ou você pode cortar "Id" no final de uma chave primária para determinar o nome de uma tabela por código. Se você usar "id" sem um nome de tabela para a chave primária, não poderá, via código, determinar o nome da tabela a partir da chave primária. Além disso, a maioria das pessoas que pluraliza nomes de tabelas e prefixa colunas PK com o nome da tabela usa a versão singular do nome da tabela na PK (por exemplo, status e status_id),
Se você tornar os nomes das tabelas singulares, faça com que eles correspondam aos nomes de classe que eles representam. Mais uma vez, isso pode simplificar o código e permitir que você faça coisas realmente legais, como instanciar uma classe, tendo apenas o nome da tabela. Isso também torna seu código mais consistente, o que leva a ...
Se você tornar o nome da tabela singular, ele tornará seu esquema de nomeação consistente, organizado e fácil de manter em todos os locais. Você sabe que em todas as instâncias do seu código, seja no nome de uma coluna, no nome da classe ou no nome da tabela, é o mesmo nome exato. Isso permite fazer pesquisas globais para ver em todos os lugares que os dados são usados. Quando você pluraliza um nome de tabela, haverá casos em que você usará a versão singular desse nome de tabela (a classe na qual ele se transforma, na chave primária). Apenas faz sentido não ter algumas instâncias em que seus dados são referidos como plural e algumas instâncias, singular.
Para resumir, se você pluralizar os nomes de suas tabelas, estará perdendo todo tipo de vantagens ao tornar seu código mais inteligente e fácil de manusear. Pode até haver casos em que você precise ter tabelas / matrizes de pesquisa para converter os nomes das tabelas em objetos ou nomes de códigos locais que você poderia ter evitado. Os nomes de tabelas singulares, embora pareçam um pouco estranhos a princípio, oferecem vantagens significativas sobre nomes pluralizados e acredito que sejam as melhores práticas.
fonte
nossa preferência:
Os nomes das tabelas devem ser plurais?
Nunca. Os argumentos para ser uma coleção fazem sentido, mas você nunca sabe o que a tabela conterá (0,1 ou muitos itens). Regras plurais tornam a nomeação desnecessariamente complicada. 1 casa, 2 casas, rato x rato, pessoa x pessoa, e nem sequer vimos outras línguas.
Update person set property = 'value'
atua sobre cada pessoa na mesa.Select * from person where person.name = 'Greg'
retorna uma coleção / conjunto de linhas de linhas pessoais.Os nomes das colunas devem ser singulares?
Normalmente, sim, exceto onde você está violando as regras de normalização.
Devo prefixar tabelas ou colunas?
Principalmente uma preferência de plataforma. Preferimos prefixar colunas com o nome da tabela. Não prefixamos tabelas, mas fazemos visualizações de prefixos (v_) e stored_procedures (sp_ ou f_ (function)). Isso ajuda as pessoas que desejam tentar atualizar v_person.age, que na verdade é um campo calculado em uma exibição (que não pode ser UPDATEd de qualquer maneira).
Também é uma ótima maneira de evitar a colisão de palavras-chave (delivery.from breaks, mas delivery_from não).
Isso torna o código mais detalhado, mas geralmente ajuda na legibilidade.
bob = new person()
bob.person_name = 'Bob'
bob.person_dob = '1958-12-21'
... é muito legível e explícito. Isso pode ficar fora de controle:
customer.customer_customer_type_id
indica um relacionamento entre o cliente e a tabela customer_type, indica a chave primária na tabela customer_type (customer_type_id) e se você vir 'customer_customer_type_id' durante a depuração de uma consulta, saberá instantaneamente de onde é (tabela do cliente).
ou onde você tem um relacionamento MM entre customer_type e customer_category (somente determinados tipos estão disponíveis para determinadas categorias)
customer_category_customer_type_id
... está um pouco (!) do lado comprido.
Devo usar algum caso para nomear itens? Sim - minúsculas :), com sublinhados. Estes são muito legíveis e multiplataforma. Juntamente com os 3 acima, também faz sentido.
A maioria delas são preferências. - Desde que você seja consistente, deve ser previsível para quem precisar lê-lo.
fonte
SELECT * FROM people AS person WHERE person.name = 'Greg'
parece o mais natural para mim.<table name><id>
, por exemploPersonID
ouPerson_ID
etc. Portanto, faz mais sentido que você NÃO nomeie suas tabelas no plural, pois cada registro é uma pessoa separada e não uma pessoa.Veja a ISO 11179-5: Princípios de nomenclatura e identificação Você pode obtê-lo aqui: http://metadata-standards.org/11179/#11179-5
Eu escrevi sobre isso há algum tempo aqui: Convenções de nomenclatura ISO-11179
fonte
Sei que está atrasado para o jogo e a pergunta já foi respondida muito bem, mas quero oferecer minha opinião sobre o # 3 sobre o prefixo dos nomes das colunas.
Todas as colunas devem ser nomeadas com um prefixo exclusivo da tabela em que estão definidas.
Por exemplo, dadas as tabelas "cliente" e "endereço", vamos usar os prefixos "cust" e "addr", respectivamente. "customer" teria "cust_id", "cust_name" etc. etc. "address" teria "addr_id", "addr_cust_id" (retorno do cliente ao FK), "addr_street" etc. etc.
Quando fui apresentado a esse padrão pela primeira vez, eu estava contra ele; Eu odiava a ideia. Eu não suportava a idéia de toda essa digitação e redundância extras. Agora, já tive experiência suficiente para nunca mais voltar.
O resultado disso é que todas as colunas no esquema do banco de dados são exclusivas. Há um grande benefício nisso, que supera todos os argumentos contra ele (na minha opinião, é claro):
Você pode pesquisar toda a sua base de códigos e encontrar com segurança todas as linhas de código que tocam uma coluna específica.
O benefício do nº 1 é incrivelmente grande. Posso descontinuar uma coluna e saber exatamente quais arquivos precisam ser atualizados antes que a coluna possa ser removida com segurança do esquema. Posso alterar o significado de uma coluna e saber exatamente qual código precisa ser refatorado. Ou posso simplesmente dizer se os dados de uma coluna estão sendo usados em uma parte específica do sistema. Não posso contar o número de vezes que isso transformou um projeto potencialmente grande em um projeto simples, nem a quantidade de horas que economizamos no trabalho de desenvolvimento.
Outro benefício relativamente menor é que você só precisa usar aliases de tabela quando faz uma associação automática:
fonte
reliably find every line of code that touches a particular column
... Não é esse o ponto?Minhas opiniões são:
1) Não, os nomes das tabelas devem ser singulares.
Embora pareça fazer sentido para a seleção simples (
select * from Orders
), faz menos sentido para o equivalente OO (Orders x = new Orders
).Uma tabela em um banco de dados é realmente o conjunto dessa entidade; faz mais sentido quando você usa a lógica de conjunto:
Essa última linha, a lógica real da junção, parece confusa com nomes de tabelas plurais.
Não tenho certeza de sempre usar um alias (como Matt sugere) esclarece isso.
2) Eles devem ser singulares, pois possuem apenas 1 propriedade
3) Nunca, se o nome da coluna for ambíguo (como acima, onde ambos têm uma coluna chamada [Key]), o nome da tabela (ou seu apelido) pode distingui-los suficientemente bem. Você deseja que as consultas sejam rápidas de digitar e simples - prefixos adicionam complexidade desnecessária.
4) O que você quiser, sugiro CapitalCase
Não acho que exista um conjunto de diretrizes absolutas em nenhuma delas.
Desde que o que você escolher seja consistente no aplicativo ou no banco de dados, não acho que isso realmente importe.
fonte
CapitalCase
?pascal case
Product.ProductName
,Product.ProductID
,Product.ProductPrice
etc digitaçãoProduct.P
dá-lhe todos os campos prefixados.Na minha opinião:
No entanto, como já foi mencionado, qualquer convenção é melhor do que nenhuma convenção. Não importa como você escolha fazê-lo, documente-o para que futuras modificações sigam as mesmas convenções.
fonte
Acho que a melhor resposta para cada uma dessas perguntas seria dada por você e sua equipe. É muito mais importante ter uma convenção de nomenclatura do que exatamente a convenção de nomenclatura é.
Como não há resposta certa para isso, você deve levar algum tempo (mas não muito) e escolher suas próprias convenções e - aqui está a parte importante - cumpri-lo.
É claro que é bom procurar informações sobre padrões sobre isso, que é o que você está perguntando, mas não fique ansioso ou preocupado com o número de respostas diferentes que você pode obter: escolha a que lhe parecer melhor.
Apenas no caso, aqui estão minhas respostas:
fonte
fonte
SELECT id,name FROM contacts WHERE email_address LIKE '%gmail%'
tabelas no plural, colunas no singular. Novamente sempre uma questão de opinião pessoal.As convenções de nomenclatura permitem que a equipe de desenvolvimento projete a capacidade de descoberta e manutenção no centro do projeto.
Uma boa convenção de nomenclatura leva tempo para evoluir, mas uma vez implementada, permite que a equipe avance com um idioma comum. Uma boa convenção de nomenclatura cresce organicamente com o projeto. Uma boa convenção de nomenclatura lida facilmente com as mudanças durante a fase mais longa e mais importante do ciclo de vida do software - gerenciamento de serviços em produção.
Aqui estão as minhas respostas:
A nomeação é difícil, mas em toda organização existe alguém que pode nomear coisas e em toda equipe de software deve haver alguém que se responsabilize pelos padrões de nomeação e garanta que os nomes sejam sec_id , sec_value e security_id sejam resolvidos mais cedo antes de serem inseridos no projeto .
Então, quais são os princípios básicos de uma boa convenção e padrões de nomenclatura:
fonte
Aqui está um link que oferece algumas opções. Eu estava procurando por uma especificação simples que eu pudesse seguir, em vez de ter que confiar em uma especificação parcialmente definida.
http://justinsomnia.org/writings/naming_conventions.html
fonte
fonte
Lastname
should beLastName
Os nomes das tabelas devem sempre ser singulares, porque representam um conjunto de objetos. Como você diz, o rebanho para designar um grupo de ovelhas, ou o rebanho designa um grupo de pássaros. Não há necessidade de plural. Quando um nome de tabela é composto por dois nomes e a convenção de nomenclatura é plural, torna-se difícil saber se o nome plural deve ser a primeira palavra ou a segunda palavra ou ambas. É a lógica - Object.instance, não objects.instance. Ou TableName.column, não TableNames.column (s). O Microsoft SQL não diferencia maiúsculas de minúsculas, é mais fácil ler os nomes das tabelas, se forem usadas letras maiúsculas, para separar os nomes de tabelas ou colunas quando elas são compostas por dois ou mais nomes.
fonte
User
é um grupo de usuários.Nome da tabela: deve ser singular, pois é uma entidade singular que representa um objeto do mundo real e não objetos, que é singular.
Nome da coluna: Deve ser singular apenas para transmitir que manterá um valor atômico e confirmará a teoria da normalização. Se, no entanto, houver n número do mesmo tipo de propriedades, elas deverão ser sufixadas com 1, 2, ..., n, etc.
Prefixando tabelas / colunas: é um tópico enorme, que será discutido mais adiante.
Invólucro: deve ser o caso Camel
Meu amigo, Patrick Karcher , peço que você não escreva nada que possa ser ofensivo para alguém, como você escreveu: "• Além disso, as chaves estrangeiras devem ser nomeadas consistentemente em tabelas diferentes. Deve ser legal espancar alguém que não faça isso.". Nunca cometi esse erro, meu amigo Patrick, mas estou escrevendo em geral. E se eles planejarem vencê-lo por isso? :)
fonte
Muito tarde para a festa, mas eu ainda queria adicionar meus dois centavos sobre prefixos de coluna
Parece haver dois argumentos principais para o uso do padrão de nomeação table_column (ou tableColumn) para colunas, ambos com base no fato de que o nome da coluna em si será exclusivo em todo o banco de dados:
1) Você não precisa especificar nomes de tabelas e / ou aliases de coluna em suas consultas o tempo todo
2) Você pode pesquisar facilmente todo o código pelo nome da coluna
Eu acho que os dois argumentos são falhos. A solução para os dois problemas sem usar prefixos é fácil. Aqui está a minha proposta:
Sempre use o nome da tabela no seu SQL. Por exemplo, sempre use table.column em vez de coluna.
Obviamente resolve 2), pois agora você pode procurar table.column em vez de table_column.
Mas eu posso ouvir você gritar, como isso resolve 1)? Era exatamente sobre evitar isso. Sim, era, mas a solução era terrivelmente falha. Por quê? Bem, a solução do prefixo se resume a:
Para evitar precisar especificar table.column quando houver ambiguidade, você nomeia todas as suas colunas table_column!
Mas isso significa que, a partir de agora, você sempre terá que escrever o nome da coluna toda vez que especificar uma coluna. Mas se você precisar fazer isso de qualquer maneira, qual é o benefício de sempre escrever explicitamente table.column? Exatamente, não há benefício, é exatamente o mesmo número de caracteres para digitar.
edit: sim, eu sei que nomear as colunas com o prefixo impõe o uso correto, enquanto minha abordagem depende dos programadores
fonte
Convenções essenciais de nomenclatura de banco de dados (e estilo) (clique aqui para obter uma descrição mais detalhada)
os nomes de tabelas escolhem nomes curtos e inequívocos, o uso de no máximo uma ou duas palavras distingue tabelas facilita facilmente a nomeação de nomes de campos únicos, bem como as tabelas de pesquisa e vinculação fornecem nomes únicos às tabelas, nunca no plural (atualização: eu ainda concordo com as razões apresentadas para esta convenção, mas a maioria das pessoas realmente gosta de nomes de tabelas plurais, então suavizei minha postura) ... siga o link acima, por favor
fonte
e.g. PATIENTS would have a primary key called pa_patient_id_pk
!!Nomes de tabela no singular. Digamos que você estivesse modelando um relacionamento entre alguém e o endereço dele. Por exemplo, se você estiver lendo um modelo de dados, prefere 'cada pessoa pode morar com 0,1 ou muitos endereços'. ou "cada pessoa pode morar em 0,1 ou muitos endereços". Eu acho que é mais fácil pluralizar o endereço do que ter que reformular as pessoas como pessoa. Além disso, os substantivos coletivos são muitas vezes diferentes da versão singular.
fonte
Essas são as convenções que aprendi, mas você deve se adaptar ao que quer que use como mangueira de desenvolvimento.
fonte