Estou iniciando um novo projeto e gostaria de obter meus nomes de tabelas e colunas desde o início. Por exemplo, eu sempre usei plural em nomes de tabelas, mas aprendi recentemente que o singular está correto.
Então, se eu tenho uma tabela "user" e produtos que somente o usuário terá, a tabela deve ser nomeada "user_product" ou apenas "product"? Este é um relacionamento de um para muitos.
Além disso, se eu tivesse (por algum motivo) várias descrições de produtos para cada produto, seria "user_product_description" ou "product_description" ou apenas "description"? É claro que com as chaves estrangeiras corretas definidas .. Nomear apenas a descrição seria problemático, pois eu também poderia ter descrição do usuário ou descrição da conta ou qualquer outra coisa ..
E se eu quiser uma tabela relacional pura (muitas para muitas) com apenas duas colunas, como seria isso? "user_stuff" ou talvez algo como "rel_user_stuff"? E se o primeiro, o que distinguiria isso, por exemplo "user_product"?
Qualquer ajuda é muito apreciada e, se houver algum tipo de padrão de convenção de nomenclatura recomendado por vocês, fique à vontade para vincular.
obrigado
primarily opinion-based
é patentemente falso.Respostas:
Nome da tabela
Sim. Cuidado com os pagãos. Os nomes plurais nas tabelas são um sinal claro de alguém que não leu nenhum dos materiais padrão e não tem conhecimento da teoria do banco de dados.
Algumas das coisas maravilhosas sobre os padrões são:
O nome da tabela padrão refere-se a cada linha da tabela, que é usada em toda a verborragia, não ao conteúdo total da tabela (sabemos que a
Customer
tabela contém todos os clientes).Relação, frase verbal
Nos bancos de dados relacionais genuínos que foram modelados (em oposição aos sistemas de arquivamento de registros anteriores à década de 1970 [caracterizados por
Record IDs
serem implementados em um contêiner de banco de dados SQL por conveniência):Diagrama_A
Obviamente, o relacionamento é implementado no SQL como
CONSTRAINT FOREIGN KEY
na tabela filho (mais, mais tarde). Aqui está a frase de verbo (no modelo), o predicado que representa (a ser lido no modelo) e o nome da restrição FK :Tabela • Idioma
No entanto, ao descrever a tabela, particularmente em linguagem técnica, como os Predicados ou outra documentação, use o singular e o plural como naturalmente no idioma inglês. Lembre-se de que a tabela é nomeada para a única linha (relação) e o idioma se refere a cada linha derivada (relação derivada):
não
(Essa não é uma questão de convenção de nomenclatura; é uma questão de design do db.) Não importa se
user::product
é 1 :: n. O que importa é seproduct
é uma entidade separada e se é uma Tabela Independente , ie. pode existir por si só. Portantoproduct
nãouser_product
.E se
product
existe apenas no contexto de umuser
, ie. é uma tabela dependente , portantouser_product
.Diagrama_B
Está certo. O
user_product_description
xorproduct_description
estará correto, com base no acima. Não é para diferenciá-lo de outroxxxx_descriptions
, mas para dar ao nome uma sensação de onde ele pertence, o prefixo sendo a tabela pai.Esperamos que todas as tabelas no banco de dados relacional sejam puramente relacionais, tabelas normalizadas. Não há necessidade de identificar isso no nome (caso contrário, todas as tabelas serão
rel_something
).Se ele contiver apenas as PKs dos dois pais (que resolvem o relacionamento lógico n :: n que não existe como uma entidade no nível lógico, em uma tabela física ), é uma Tabela Associativa . Sim, normalmente o nome é uma combinação dos dois nomes de tabela pai.
Observe que nesses casos a frase verbal se aplica a, e é lida como, de pai para pai, ignorando a tabela filho, porque seu único objetivo na vida é relacionar os dois pais.
Diagrama_C
Se é não uma tabela associativa (isto é. Para além das duas PKs, que contém dados), em seguida, nomeia-o de forma adequada, e as frases de verbo aplicar a ele, não o pai no final da relação.
Diagrama_D
Se você terminar com duas
user_product
tabelas, é um sinal muito alto de que você não normalizou os dados. Então, volte algumas etapas e faça isso e nomeie as tabelas com precisão e consistência. Os nomes então se resolverão.Convenção de nomes
O que você está fazendo é muito importante e afetará a facilidade de uso e entendimento em todos os níveis. Portanto, é bom obter o máximo de compreensão possível desde o início. A relevância da maior parte disso não ficará clara até você começar a codificar no SQL.
Case é o primeiro item a ser abordado. Todas as letras maiúsculas são inaceitáveis. A combinação de maiúsculas e minúsculas é normal, especialmente se as tabelas estiverem diretamente acessíveis pelos usuários. Consulte meus modelos de dados. Observe que, quando o buscador está usando algum NonSQL demente, que possui apenas letras minúsculas, eu dou isso; nesse caso, incluo sublinhados (conforme seus exemplos).
Mantenha um foco de dados , não um aplicativo ou foco de uso. Afinal, em 2011, possuímos Arquitetura Aberta desde 1984, e os bancos de dados devem ser independentes dos aplicativos que os utilizam.
Dessa forma, à medida que crescem e mais do que o único aplicativo os usa, a nomeação permanecerá significativa e não precisará de correção. (Os bancos de dados completamente incorporados em um único aplicativo não são bancos de dados.) Nomeie apenas os elementos de dados.
Seja muito atencioso e nomeie tabelas e colunas com muita precisão . Não use
UpdatedDate
se for umDATETIME
tipo de dados, useUpdatedDtm
. Não use_description
se ele contém uma dosagem.É importante ser consistente em todo o banco de dados. Não use
NumProduct
em um local para indicar o número de Produtos eItemNo
ouItemNum
em outro local para indicar o número de Itens. UseNumSomething
para números de e /SomethingNo
ouSomethingId
identificadores de forma consistente.Não prefixe o nome da coluna com um nome de tabela ou código de acesso, como
user_first_name
. O SQL já fornece o nome da tabela como um qualificador:Exceções:
A primeira exceção é para PKs, elas precisam de tratamento especial porque você as codifica em junções, o tempo todo e deseja que as chaves se destacem das colunas de dados. Sempre use
user_id
, nuncaid
.user_id
é a coluna que identifica um usuário, não oid
dauser
tabela.user_product
tabela teráuser_id
um componente como seu PK(user_id, product_no)
.id
muitas tabelas, é fácil se misturar na codificação SQL. Segundo, qualquer pessoa que não seja o codificador inicial não tem ideia do que estava tentando fazer. Ambos são fáceis de impedir, se as colunas principais forem tratadas como acima.A segunda exceção é onde há mais de um FK referenciando a mesma tabela da tabela pai, transportada no filho. De acordo com o Modelo Relacional , use Nomes de Função para diferenciar o significado ou uso, por exemplo.
AssemblyCode
eComponentCode
para doisPartCodes
. E nesse caso, não use o indiferenciadoPartCode
para um deles. Seja preciso.Diagrama_E
Prefixo
Onde você tem mais do que 100 tabelas, prefixe os nomes das tabelas com uma Área de Assunto:
REF_
para tabelas de referênciaOE_
para o cluster de entrada de pedidos, etc.Somente no nível físico, não no lógico (ele atrapalha o modelo).
Sufixo
Nunca use sufixos em tabelas e sempre use sufixos em todo o resto. Isso significa que, no uso lógico e normal do banco de dados, não há sublinhados; mas no lado administrativo, sublinhados são usados como um separador:
_V
Exibir (com o principalTableName
na frente, é claro)_fk
Chave estrangeira (o nome da restrição, não o nome da coluna) Transação de segmento de_cac
cache (processo ou função armazenada) Função (não transacional), etc._seg
_tr
_fn
O formato é o nome da tabela ou do FK, um sublinhado e o nome da ação, um sublinhado e, finalmente, o sufixo.
Isso é realmente importante porque quando o servidor fornece uma mensagem de erro:
____
blah blah blah error on object_name
você sabe exatamente qual objeto foi violado e o que estava tentando fazer:
____
blah blah blah error on Customer_Add_tr
Chaves estrangeiras (a restrição, não a coluna). A melhor nomeação para um FK é usar a frase de verbo (menos o "each" e a cardinalidade).
Customer_Initiates_SalesOrder_fk
Part_Comprises_Component_fk
Part_IsConsumedIn_Assembly_fk
Use a
Parent_Child_fk
sequência, nãoChild_Parent_fk
porque (a) ela aparece na ordem de classificação correta quando você está procurando por elas e (b) sempre conhecemos a criança envolvida, o que estamos imaginando é qual pai. A mensagem de erro é maravilhosa:____
Foreign key violation on Vendor_Offers_PartVendor_fk
.Isso funciona bem para pessoas que se preocupam em modelar seus dados, onde as frases verbais foram identificadas. Quanto ao resto, os sistemas de arquivamento de registros, etc, uso
Parent_Child_fk
.Os índices são especiais, portanto, eles têm uma convenção de nomenclatura própria, composta de, em ordem , cada posição de caractere de 1 a 3:
U
Exclusivo ou_
para separador em cluster não exclusivoC
ou_
para_
separador não em clusterPara o restante:
Se a chave for uma coluna ou poucas colunas:
____
ColumnNames
Se a chave tiver mais do que algumas colunas:
____
PK
Chave Primária (conforme modelo)____
AK[*n*]
Chave Alternativa (termo IDEF1X)Observe que o nome da tabela não é obrigatório no nome do índice, porque sempre aparece como
table_name.index_name.
Portanto, quando
Customer.UC_CustomerId
ouProduct.U__AK
aparece em uma mensagem de erro, isso indica algo significativo. Quando você olha para os índices em uma tabela, é possível diferenciá-los facilmente.Encontre alguém qualificado e profissional e siga-o. Observe seus designs e estude cuidadosamente as convenções de nomenclatura que eles usam. Faça perguntas específicas sobre qualquer coisa que você não entenda. Por outro lado, corra como qualquer outro que demonstre pouca consideração por convenções ou padrões de nomes. Aqui estão alguns para você começar:
Entrada e inventário de pedidos com endereços compatíveis com o padrão
Sistema de boletim inter-office simples para PHP / MyNonSQL
Monitoramento de sensores com capacidade temporal total
Respostas às perguntas
Isso não pode ser razoavelmente respondido no espaço para comentários.
Existem dois grandes problemas no seu comentário:
Você declara que seu exemplo é "o mais trivial", no entanto, é tudo menos. Com esse tipo de contradição, não tenho certeza se você é sério, se tecnicamente capaz.
Essa especulação "trivial" tem vários erros grosseiros de Normalização (DB Design).
Até você corrigi-las, elas não são naturais e anormais, e não fazem nenhum sentido. Você também pode chamá-los de anormal_1, anormal_2, etc.
Você tem "fornecedores" que não fornecem nada; referências circulares (ilegais e desnecessárias); clientes que compram produtos sem nenhum instrumento comercial (como Fatura ou Pedido de Vendas) como base para a compra (ou os clientes "possuem" produtos?); relacionamentos muitos-para-muitos não resolvidos; etc.
Uma vez Normalizado, e as tabelas necessárias forem identificadas, seus nomes se tornarão óbvios. Naturalmente.
De qualquer forma, tentarei atender à sua consulta. O que significa que terei que acrescentar algum sentido a ela, sem saber o que você quis dizer, então, por favor, tenha paciência comigo. Os erros grosseiros são muitos para listar e, dada a especificação de reposição, não estou confiante de ter corrigido todos eles.
Assumirei que, se o produto é composto de componentes, o produto é um conjunto e os componentes são usados em mais de um conjunto.
Além disso, como "O fornecedor vende componentes de zero a muitos", que eles não vendem produtos ou conjuntos, eles vendem apenas componentes.
Especulação vs modelo normalizado
Caso você não saiba, a diferença entre cantos quadrados (Independente) e cantos arredondados (Dependente) é significativa, consulte o link de Notação IDEF1X. Da mesma forma, as linhas sólidas (identificação) vs linhas tracejadas (não identificação).
Agora que resolvi as tabelas, não entendo seu problema. Talvez você possa postar uma pergunta específica .
Supondo que não haja erros de normalização,
User likes Product
é um predicado, não uma tabela. Não os confunda. Consulte minha resposta, onde se relaciona com assuntos, verbos e predicados, e minha resposta a Larry imediatamente acima.Cada tabela contém um conjunto de fatos (cada linha é um fato). Predicados (ou proposições) não são fatos, podem ou não ser verdadeiros.
O Modelo Relacional é baseado no Cálculo de Predicado de Primeira Ordem (mais conhecido como Lógica de Primeira Ordem). Um Predicado é uma frase de cláusula única em inglês simples e preciso, avaliada como verdadeira ou falsa.
Além disso, cada tabela representa ou é a implementação de muitos Predicados, não um.
Uma consulta é um teste de um Predicado (ou vários Predicados, encadeados) que resulta em verdadeiro (o Fato existe) ou falso (o Fato não existe).
Assim, as tabelas devem ser nomeadas, conforme detalhado em minha resposta (convenções de nomenclatura), para a linha, o Fato e os Predicados devem ser documentados (por todos os meios, faz parte da documentação do banco de dados), mas como uma lista separada de Predicados .
Esta não é uma sugestão de que eles não são importantes. Eles são muito importantes, mas não vou escrever isso aqui.
Rapidamente, então. Como o Modelo Relacional é baseado no FOPC, pode-se dizer que todo o banco de dados é um conjunto de declarações do FOPC, um conjunto de Predicados. Mas (a) existem muitos tipos de Predicados e (b) uma tabela não representa um Predicado (é a implementação física de muitos Predicados e de diferentes tipos de Predicados).
Portanto, nomear a tabela como "o" predicado que ela "representa" é um conceito absurdo.
Os "teóricos" conhecem apenas alguns Predicados, eles não entendem que, desde que o RM foi fundado na FOL, todo o banco de dados é um conjunto de Predicados e de tipos diferentes.
E, é claro, eles escolhem os absurdos dentre os poucos que sabem
EXISTING_PERSON
:;PERSON_IS_CALLED
. Se não fosse tão triste, seria hilário.Observe também que o nome padrão ou da tabela atômica (nomeando a linha) funciona de maneira brilhante para toda a verborragia (incluindo todos os Predicados anexados à tabela). Por outro lado, o idiota "tabela representa predicado" nome não pode. O que é bom para os "teóricos", que entendem muito pouco sobre predicados, mas retardam o contrário.
Os Predicados relevantes para o modelo de dados são expressos no modelo e são de duas ordens.
Predicado Unário
O primeiro conjunto é diagramático , não texto: a notação em si . Estes incluem vários Existential; Orientado a restrições; e predicados do descritor (atributos).
Predicado binário
O segundo conjunto é aquele que forma relacionamentos entre os fatos. Esta é a linha de relação. A frase verbal (detalhada acima) identifica o predicado, a proposição que foi implementada (que pode ser testada via consulta). Não se pode ficar mais explícito que isso.
Aqui está um Modelo de Dados , onde listei os Predicados. Eu escolhi esse exemplo porque mostra os Predicados Existenciais, etc., bem como os Relacionados, os únicos Predicados não listados são os Descritores. Aqui, devido ao nível de aprendizado do candidato, estou tratando-o como um usuário.
Portanto, o evento de mais de uma tabela filha entre duas tabelas pai não é um problema, apenas nomeie-as como Fato Existencial quanto ao seu conteúdo e normalize os nomes.
As regras que eu dei para frases verbais para nomes de relacionamento para tabelas associativas entram em jogo aqui. Aqui está uma discussão Predicado x Tabela , cobrindo todos os pontos mencionados, em resumo.
Para uma boa descrição curta do uso adequado dos Predicados e de como usá-los (que é um contexto bem diferente do de responder aos comentários aqui), visite esta resposta e role para baixo até a seção Predicado .
Ok, é o que chamamos de tabela Key ou NextKey. Nomeie como tal. Se você tiver SubjectAreas, use COM_NextKey para indicar que é comum no banco de dados.
Btw, esse é um método muito ruim de gerar chaves. Não é escalável, mas com o desempenho da Oracle, provavelmente está "muito bem". Além disso, indica que seu banco de dados está cheio de substitutos, não relacionais nessas áreas. O que significa desempenho extremamente ruim e falta de integridade.
fonte
Singular vs. Plural: Escolha um e fique com ele.
As colunas não devem ser prefixadas / com sufixo / infixadas ou, de qualquer forma, fixadas com referências ao fato de serem colunas. O mesmo vale para as tabelas. Não nomeie as tabelas EMPLOYEE_T ou TBL_EMPLOYEES porque, no segundo em que é substituída por uma visualização, as coisas ficam realmente confusas.
Não incorpore informações de tipo em nomes, como "vc_firstname" para varchar ou "flavour_enum". Além disso, não incorpore restrições nos nomes das colunas, como "department_fk" ou "employee_pk".
Na verdade, a única coisa boa sobre correções * eu posso pensar, é que você pode usar palavras reservadas como
where_t
,tbl_order
,user_vw
. Obviamente, nesses exemplos, o uso do plural teria resolvido o problema :)Não nomeie todas as chaves como "ID". As chaves referentes à mesma coisa devem ter o mesmo nome em todas as tabelas. A coluna de identificação do usuário pode ser chamada USER_ID na tabela de usuários e em todas as tabelas que fazem referência ao usuário. O único momento em que é renomeado é quando diferentes usuários estão desempenhando funções diferentes, como Mensagem (sender_user_id, receiver_user_id). Isso realmente ajuda ao lidar com consultas maiores.
Em relação ao CaSe:
Em geral, é melhor nomear "tabelas de mapeamento" para corresponder à relação que descreve, em vez dos nomes das tabelas referenciadas. Um usuário pode ter qualquer número de relações com produtos:
user_likes_product
,user_bought_product
,user_wants_to_buy_product
.fonte
{table_name}_id
vez de apenasid
, uma vez que a coluna só será referida com o nome da tabela prefixado como qualificador, por exemplotable_name.id
. Por contexto, estou operando em um ecossistema em que a sintaxe de junção do formuláriotable_a JOIN table_b ON table_b_id_column
não é suportada; Eu tenho que fazertable_a JOIN table_b ON table_b.id_column = table_a.table_b_id_column
.Não existe 'correto' entre singular versus plural - é principalmente uma questão de gosto.
Depende em parte do seu foco. Se você pensa na tabela como uma unidade, ela contém 'plurais' (porque ela contém muitas linhas - portanto, um nome plural é apropriado). Se você pensa no nome da tabela como identificando uma linha em uma tabela, prefere 'singular'. Isso significa que seu SQL será considerado como trabalhando em uma linha da tabela. Tudo bem, embora geralmente seja uma simplificação excessiva; SQL trabalha em conjuntos (mais ou menos). No entanto, podemos ir com singular para as respostas a esta pergunta.
Como você provavelmente precisará de uma tabela 'usuário', outro 'produto' e o terceiro para conectar usuários a produtos, será necessário uma tabela 'usuário_produto'.
Como a descrição se aplica a um produto, você usaria 'product_description'. A menos que cada usuário nomeie cada produto para si ...
A tabela 'user_product' é (ou poderia ser) um exemplo de tabela com um ID do produto e um ID do usuário e não muito mais. Você nomeia as tabelas de dois atributos da mesma maneira geral: 'user_stuff'. Prefixos decorativos como 'rel_' realmente não ajudam. Você verá algumas pessoas usando 't_' na frente do nome de cada tabela, por exemplo. Isso não é muita ajuda.
fonte
Os plurais não são ruins, desde que sejam usados de forma consistente - mas singular é a minha preferência.
Eu dispensaria os sublinhados, a menos que você queira delinear um relacionamento muitos-para-muitos; e use um capital inicial porque ajuda a distinguir as coisas nos ORMs.
Mas existem muitas convenções de nomenclatura; portanto, se você quiser usar sublinhados, tudo bem, desde que seja feito de forma consistente.
Assim:
Se apenas um usuário puder ter algum produto,
Mas se o produto for compartilhado pelos usuários:
Se você salvar seus sublinhados em relacionamentos muitos para muitos, poderá fazer algo como:
para formar um M-para-M entre o UserProduct e o Stuff - não tenho certeza da pergunta sobre a natureza exata dos muitos para muitos necessários.
fonte
Não é mais correto usar a forma singular do que a plural, onde você ouviu isso? Prefiro dizer que a forma plural é mais comum para nomear tabelas de banco de dados ... e, na minha opinião, também mais lógica. A tabela geralmente contém mais de uma linha;) Em um modelo conceitual, os nomes das entidades costumam ser singulares.
Sobre sua pergunta, se 'Product' e 'ProductDescription' forem conceitos com uma identidade (ou seja, entidades) em seu modelo, eu simplesmente chamaria as tabelas 'Products' e 'ProductDescriptions'. Para tabelas usadas para implementar um relacionamento muitos-para-muitos, costumo usar a convenção de nomenclatura "SideA2SideB", por exemplo "Student2Course".
fonte