Nomenclatura de colunas de ID em tabelas de banco de dados

97

Eu queria saber a opinião das pessoas sobre a nomenclatura de colunas de ID em tabelas de banco de dados.

Se eu tiver uma tabela chamada Faturas com uma chave primária de uma coluna de identidade, eu chamaria essa coluna de InvoiceID para não entrar em conflito com outras tabelas e é óbvio o que é.

Onde estou trabalhando atualmente, eles chamaram todas as colunas de ID de ID.

Então, eles fariam o seguinte:

Select  
    i.ID 
,   il.ID 
From
    Invoices i
    Left Join InvoiceLines il
        on i.ID = il.InvoiceID

Agora, vejo alguns problemas aqui:
1. Você precisaria criar um alias para as colunas no select
2. ID = InvoiceID não cabe em meu cérebro
3. Se você não criou um alias para as tabelas e se referiu a InvoiceID, é óbvio que tabela está ligado?

Quais são os pensamentos de outras pessoas sobre o assunto?

Arry
fonte
1
Argh, estamos rodeados de gente de mau gosto! ;-)
Vinko Vrsalovic
2
Que tal selecionar a segunda resposta como " a resposta "?
exibição de
Possível duplicata do esquema de nomenclatura de chave estrangeira
philipxy

Respostas:

23

ID é um antipadrão SQL. Consulte http://www.amazon.com/s/ref=nb_sb_ss_i_1_5?url=search-alias%3Dstripbooks&field-keywords=sql+antipatterns&sprefix=sql+a

Se você tem muitas tabelas com ID como o id, você está tornando o relatório muito mais difícil. Ele obscurece o significado e torna as consultas complexas mais difíceis de ler, além de exigir que você use aliases para diferenciar no próprio relatório.

Além disso, se alguém for tolo o suficiente para usar uma junção natural em um banco de dados onde ele está disponível, você juntará os registros errados.

Se você gostaria de usar a sintaxe USING que alguns dbs permitem, você não pode se usar ID.

Se você usar ID, pode facilmente acabar com uma junção incorreta se acontecer de estar copiando a sintaxe de junção (não me diga que ninguém nunca faz isso!) E se esqueça de alterar o alias na condição de junção.

Então agora você tem

select t1.field1, t2.field2, t3.field3
from table1 t1 
join table2 t2 on t1.id = t2.table1id
join table3 t3 on t1.id = t3.table2id

quando você quis dizer

select t1.field1, t2.field2, t3.field3 
from table1 t1 
join table2 t2 on t1.id = t2.table1id
join table3 t3 on t2.id = t3.table2id

Se você usar tablenameID como o campo de id, esse tipo de erro acidental é muito menos provável de acontecer e muito mais fácil de encontrar.

HLGEM
fonte
8
@ spencer7593, só porque você gosta de ID não significa que não seja um antipadrão. É mais difícil cometer erros em joins quando você tem o id tablename porque você obteria um erro de sintaxe imediatamente.
HLGEM
6
+1 As colunas que são sinônimos devem ter o mesmo nome - usando o prefixo do nome da tabela, você pode ter uma coluna de chave primária chamada table1ID e uma coluna de chave estrangeira em outra tabela chamada table1ID - e você SABE que elas são a mesma coisa. Aprendi isso há 20 anos e é uma prática que não decepciona.
amelvin
9
NÃO! Esta é a convenção de nomenclatura smurf!
Ross
19
Não gosto dessa convenção porque significa apenas que você é praticamente forçado a criar um alias para todas as suas tabelas, para não nomear redundantemente a tabela, nomear a tabela novamente e adicionar o id. join table2 on table1.table1id = table2.table1id. Seu raciocínio está ok, exceto que se você usar id, o nome da tabela estará na frente do ID de qualquer maneira. join table2 on table1.id = table2.table1id... que é tão prolixo e não redundante, nem força apelidos obscuros para evitar a redundância mencionada .. que na minha opinião são a ruína do desenvolvimento sql.
Anther
13
Então, se você tiver um Namecampo em uma tabela, deve alterá-lo para Table1Namepara evitar os mesmos problemas com esse campo? Você deve prefixar todas as colunas com o nome da tabela pelo mesmo motivo? Isso não parece certo.
Joanvo,
151

Sempre preferi ID a TableName + ID para a coluna id e, a seguir, TableName + ID para uma chave estrangeira. Dessa forma, todas as tabelas têm o mesmo nome para o campo id e não há uma descrição redundante. Isso parece mais simples para mim porque todas as tabelas têm o mesmo nome de campo de chave primária.

Quanto a juntar tabelas e não saber qual campo de Id pertence a qual tabela, na minha opinião a consulta deve ser escrita para lidar com essa situação. Onde eu trabalho, sempre prefixamos os campos que usamos em uma instrução com o alias de tabela / tabela.

kemiller2002
fonte
2
Percebo um tópico antigo, mas concordo. Também torna o mapeamento na camada de acesso a dados mais fácil: se todos os "objetos" têm um campo de Id que deve ser único, ao criar métodos na camada de acesso a dados para fazer coisas como excluir itens, você pode torná-los genéricos, pois pode receber uma lista de Ids para qualquer coisa e saiba que você só precisa excluir onde Id = blah daquela tabela específica, em vez de ter que manter um mapeamento do que é único para cada tabela, bem como o mapeamento do nome da tabela / nome lógico do programa.
Mike
1
Kevin, igual a você. por exemplo: user_id, role_id para PKey e role_user_id para FKey. É bom em um projeto de grande escala. Porque se todos os campos de ID forem nomeados como "id", é muito confuso. Mas eu acho que é preferência pessoal, alguém acha que só usar "id" é claro.
Cheung
2
Essa é minha preferência. Só porque as consultas entre tabelas são mais difíceis de ler, não significa que a coluna Id deve ser alterada para torná-la mais fácil. Basta tornar seus aliases mais descritivos.
tmutton
1
Suspeito que a convenção de prefixar ID com nome de entidade vem de pessoas que usam "selecionar * de" por quaisquer motivos. Em um ambiente tolerante a "selecionar *", a realidade geralmente fica distorcida no sentido de apoiar a seleção em massa de tudo de todos os lugares. Não faz muito sentido se você não seleciona tudo cegamente. Também há referências a USING e junções naturais, que são bastante perigosas e também não parecem um argumento para mim porque elas efetivamente impedem que você use a convenção de nomenclatura de chave estrangeira baseada em função.
Roman Polunin de
53

Tem havido uma briga de nerds sobre isso na minha companhia ultimamente. O advento do LINQ tornou o padrão redundante tablename + ID ainda mais obviamente bobo aos meus olhos. Acho que as pessoas mais razoáveis ​​dirão que se você está escrevendo seu SQL à mão de tal maneira que você tem que especificar nomes de tabelas para diferenciar FKs, então não é apenas uma economia na digitação, mas adiciona clareza ao seu SQL para usar apenas o ID em que você pode ver claramente qual é o PK e qual é o FK .

Por exemplo

FROM Employees e LEFT JOIN Customers c ON e.ID = c.EmployeeID

me diz não só que os dois estão ligados, mas qual é o PK e qual é o FK . Já no estilo antigo, você é forçado a olhar ou torcer para que tenham um nome adequado.

Echostorm
fonte
2
Exceto que nunca conheci um único desenvolvedor em minha vida para escrever seu exemplo. Em vez disso, eles escrevem: LEFT JOIN Customers as c ON e.ID = c.EmployeeID Para mim, isso é mais claro: LEFT JOIN Customers as c ON e.EmployeeID = c.EmployeeID E qual item é a chave estrangeira é óbvio pelo nome da tabela . obviamente, customer.employeeId é uma chave estrangeira, enquanto employee.employeeId não é.
dallin
7
Muitas pessoas (como redatores de relatórios que escrevem sql muito complexo) e especialistas em BI que fazem importações e exportações ainda precisam escrever SQl à mão. O design do banco de dados também deve acomodar os desenvolvedores, não apenas os aplicativos.
HLGEM
29

Usamos InvoiceID, não ID. Isso torna as consultas mais legíveis - quando você vê IDsozinho, isso pode significar qualquer coisa, especialmente quando você cria um alias para a tabela i.

Jason Cohen
fonte
Concorde e aponte o principal motivo para não usar "id", porque sempre temos um alias de tabela como "i" para inoice, p para "produto" em SQL ou LINQ etc.
Cheung
2
Usar o Id é mais apropriado. A coluna está na tabela “faturas” então isso deve ser suficiente. Se você estiver escrevendo consultas de tabela cruzada, deverá usar aliases mais descritivos. "i" não é suficiente. Chame isso de "faturas".
tmutton
1
Não está claro se "ID" por si só significa faturas. Suponha que você também tenha chaves estrangeiras para contas e pessoas. Agora, qual é "ID?" Não é mais fácil em uma junção, digamos, ler a.InvoiceID = b.InvoiceID em vez de a.ID = b.InvoiceID e não ser capaz de depurá-lo facilmente.
Jason Cohen
22

Eu concordo com Keven e algumas outras pessoas aqui que o PK para uma tabela deve ser simplesmente Id e as chaves estrangeiras listam a OtherTable + Id.

No entanto, desejo acrescentar uma razão que recentemente deu mais peso a este argumento.

Em minha posição atual, estamos empregando a estrutura de entidade usando a geração POCO. Usando a convenção de nomenclatura padrão de Id, o PK permite a herança de uma classe de base poco com validação e tal para tabelas que compartilham um conjunto de nomes de coluna comuns. Usar Tablename + Id como o PK para cada uma dessas tabelas destrói a capacidade de usar uma classe base para elas.

Apenas um pouco para pensar.

penhor
fonte
8
+1 para um exemplo do mundo real de como a nomenclatura genérica melhora a reutilização de código em casos específicos (com isso muitos desenvolvedores se preocuparão, pois há milhões de desenvolvedores .NET e muitos usarão EF).
codingoutloud
Não apenas EF e similares no meu trabalho, temos muitos métodos genéricos. Portanto, um serviço da web terá algo como List <Result> Save <T> (List <int> Ids); Como sabemos que cada tabela tem uma coluna Id que é a chave primária, podemos fazer coisas assim com apenas um mapeamento simples de objetos C # para suas tabelas (algo como <Customer, "Customers">, <BillingCode, "BillingCodes"> ( ou melhor ainda, nomes de proc armazenados), gere o sql em tempo real com base no objeto que é passado e voila, nenhum método de salvar / excluir / editar repetido para cada tipo de objeto.
Mike
11

Minha preferência também é ID para chave primária e TableNameID para chave estrangeira. Também gosto de ter uma coluna "nome" na maioria das tabelas onde mantenho o identificador legível pelo usuário (ou seja, nome :-)) da entrada. Essa estrutura oferece uma grande flexibilidade na própria aplicação, posso manipular tabelas em massa, da mesma forma. Isso é uma coisa muito poderosa. Normalmente, um software OO é construído sobre o banco de dados, mas o conjunto de ferramentas OO não pode ser aplicado porque o próprio banco de dados não permite isso. Ter as colunas id e name ainda não é muito bom, mas é um passo.

Selecione
i.ID, il.ID em Faturas i Left Join InvoiceLines il on i.ID = il.InvoiceID

Por que não posso fazer isso?

Select  
    Invoices.ID 
,   InvoiceLines.ID 
From
    Invoices
    Left Join InvoiceLines
        on Invoices.ID = InvoiceLines.InvoiceID

Na minha opinião, isso é muito legível e simples. Nomear variáveis ​​como i e il é uma escolha ruim em geral.

bjdodo
fonte
10

Não é realmente importante, você provavelmente encontrará problemas semelhantes em todas as convenções de nomenclatura.

Mas é importante ser consistente para que você não precise olhar as definições da tabela toda vez que escrever uma consulta.

Nir
fonte
8

Acabei de começar a trabalhar em um local que usa apenas "ID" (nas tabelas centrais, referenciado por TableNameID em chaves estrangeiras) e já encontrei DOIS problemas de produção causados ​​diretamente por ele.

Em um caso, a consulta usou "... onde ID em (SELECT ID FROM OtherTable ..." em vez de "... where ID em (SELECT TransID FROM OtherTable ...".

Alguém pode dizer honestamente que não teria sido muito mais fácil identificar se nomes completos e consistentes fossem usados ​​onde a instrução errada seria "... onde TransID está (SELECT OtherTableID de OtherTable ..."? Eu não acho tão.

O outro problema ocorre ao refatorar o código. Se você usar uma tabela temporária enquanto anteriormente a consulta saía de uma tabela central, o código antigo é "... dbo.MyFunction (t.ID) ..." e se isso não for alterado, mas "t" agora se refere a um tabela temporária em vez da tabela principal, você nem mesmo obtém um erro - apenas resultados errados.

Se gerar erros desnecessários é uma meta (talvez algumas pessoas não tenham trabalho suficiente?), Então esse tipo de convenção de nomenclatura é ótimo. Caso contrário, uma nomenclatura consistente é o caminho a percorrer.

Eric Kassan
fonte
3
+1 para o exemplo do mundo real de um nome mais específico melhorando a sustentabilidade.
codingoutloud
6

Por questões de simplicidade, a maioria das pessoas nomeia a coluna na tabela ID. Se ela tiver uma referência de chave estrangeira em outra tabela, eles explicitamente a chamam de InvoiceID (para usar seu exemplo) no caso de junções, você está criando um alias para a tabela de qualquer maneira, então inv.ID explícito ainda é mais simples do que inv.InvoiceID

Michael Brown
fonte
6

Eu pessoalmente prefiro (como foi dito acima) o Table.ID para o PK e o TableID para o FK . Mesmo (por favor, não atire em mim) o Microsoft Access recomenda isso.

NO ENTANTO, TAMBÉM sei que algumas ferramentas de geração favorecem o TableID para PK porque tendem a vincular todos os nomes de coluna que contêm 'ID' na palavra, INCLUINDO ID !!!

Até mesmo o designer de consulta faz isso no Microsoft SQL Server (e para cada consulta que você cria, você acaba removendo todos os relacionamentos recém-criados desnecessários em todas as tabelas no ID da coluna)

ASSIM, por mais que meu TOC interno odeie, mantenho a convenção TableID . Vamos lembrar que ele é chamado de Data BASE , pois será a base para muitos e muitos aplicativos que virão. E todas as tecnologias devem se beneficiar de um Esquema bem normalizado com uma descrição clara.

Nem é preciso dizer que EU traço minha linha quando as pessoas começam a usar TableName, TableDescription e outros. Em minha opinião, as convenções devem fazer o seguinte:

  • Nome da tabela: Pluralizado. Ex. Funcionários
  • Alias ​​da tabela: Nome completo da tabela, singularizado. Ex.

    SELECT Employee.*, eMail.Address
    FROM Employees AS Employee LEFT JOIN eMails as eMail on Employee.eMailID = eMail.eMailID -- I would sure like it to just have the eMail.ID here.... but oh well

[Atualizar]

Além disso, existem algumas postagens válidas neste tópico sobre colunas duplicadas devido ao "tipo de relacionamento" ou função. Exemplo, se uma loja tem um EmployeeID , isso me diz o que devo. Então, às vezes, faço algo como Store.EmployeeID_Manager . Claro que é um pouco maior, mas pelo menos as pessoas não vão enlouquecer tentando encontrar a tabela ManagerID , ou o que EmployeeID está fazendo lá. Quando a consulta for ONDE, eu simplificaria como: SELECT EmployeeID_Manager as ManagerID FROM Store

percebus
fonte
Eu acho que seu ponto é bom para fins didáticos e de beleza do banco de dados, mas para a funcionalidade acho que é um problema. Nomes de tabelas plurais promovem inconsistência entre tabelas e PK Id <-> FK IdTable cria diferenças no nome da mesma coisa. Ao mesmo tempo, algo como User.UserIdé meio estranho de digitar na programação.
Machado
4

Vendo isso da perspectiva de um dicionário de dados formal, eu nomearia o elemento de dados invoice_ID. Geralmente, um nome de elemento de dados será único no dicionário de dados e, idealmente, terá o mesmo nome em todo o período, embora às vezes termos de qualificação adicionais possam ser necessários com base no contexto, por exemplo, o elemento de dados nomeado employee_IDpode ser usado duas vezes no organograma e, portanto, qualificado como supervisor_employee_IDe subordinate_employee_IDrespectivamente.

Obviamente, as convenções de nomenclatura são subjetivas e uma questão de estilo. Acho que as diretrizes ISO / IEC 11179 são um ponto de partida útil.

Para o SGBD, vejo as tabelas como coleções de entidades (exceto aquelas que contêm apenas uma linha, por exemplo, tabela cofig, tabela de constantes, etc.), por exemplo, a tabela onde my employee_IDé a chave seria nomeada Personnel. Então, de imediato, a TableNameIDconvenção não funciona para mim.

Já vi o TableName.ID=PK TableNameID=FKestilo usado em modelos de dados grandes e devo dizer que o acho um pouco confuso: prefiro muito mais que o nome de um identificador seja o mesmo, ou seja, não muda o nome com base na tabela em que aparece. Algo a ser observado é o estilo mencionado acima parece ser usado nas lojas que adicionam uma IDENTITYcoluna (auto-incremento) a todas as tabelas, enquanto evitam as chaves naturais e compostas nas chaves estrangeiras. Essas lojas tendem a não ter dicionários de dados formais nem construir a partir de modelos de dados. Novamente, esta é apenas uma questão de estilo e que eu pessoalmente não concordo. Então, no final das contas, não é para mim.

Dito isso, às vezes vejo um caso de descartar o qualificador do nome da coluna quando o nome da tabela fornece um contexto para fazer isso, por exemplo, o elemento nomeado employee_last_namepode se tornar simplesmente last_namena Personneltabela. O raciocínio aqui é que o domínio é 'sobrenomes de pessoas' e é mais provável que seja UNIONeditado com last_namecolunas de outras tabelas em vez de ser usado como uma chave estrangeira em outra tabela, mas, novamente ... Posso apenas mudar de ideia, às vezes você nunca sabe. É isso: modelagem de dados é parte arte, parte ciência.

um dia quando
fonte
2

Acho que você pode usar qualquer coisa para o "ID", desde que seja consistente. Incluir o nome da tabela é importante para. Eu sugeriria o uso de uma ferramenta de modelagem como o Erwin para impor as convenções e padrões de nomenclatura para que, ao escrever consultas, seja fácil entender os relacionamentos que podem existir entre as tabelas.

O que quero dizer com a primeira declaração é que, em vez de ID, você pode usar algo como 'recno'. Portanto, essa tabela teria um PK de invoice_recno e assim por diante.

Saúde, Ben


fonte
2

Meu voto é para InvoiceID para o ID da tabela. Eu também uso a mesma convenção de nomenclatura quando ela é usada como uma chave estrangeira e uso nomes de alias inteligentes nas consultas.

 Select Invoice.InvoiceID, Lines.InvoiceLine, Customer.OrgName
 From Invoices Invoice
 Join InvoiceLines Lines on Lines.InvoiceID = Invoice.InvoiceID
 Join Customers Customer on Customer.CustomerID = Invoice.CustomerID

Claro, é mais longo do que alguns outros exemplos. Mas sorria. Isso é para a posteridade e, algum dia, algum pobre programador júnior terá que alterar sua obra-prima. Neste exemplo, não há ambigüidade e, à medida que tabelas adicionais são adicionadas à consulta, você ficará grato pelo detalhamento.

Rob Allen
fonte
1

Para o nome da coluna no banco de dados, eu usaria "InvoiceID".

Se eu copiar os campos em uma estrutura sem nome via LINQ, posso chamá-lo de "ID" lá, se for a única ID na estrutura.

Se a coluna NÃO for usada em uma chave estrangeira, de forma que ela seja usada apenas para identificar exclusivamente uma linha para edição, edição ou exclusão, vou chamá-la de "PK".

James Curran
fonte
1

Se você der a cada chave um nome exclusivo, por exemplo, "invoices.invoice_id" em vez de "invoices.id", você pode usar os operadores "natural join" e "using" sem preocupações. Por exemplo

SELECT * FROM invoices NATURAL JOIN invoice_lines
SELECT * FROM invoices JOIN invoice_lines USING (invoice_id)

ao invés de

SELECT * from invoices JOIN invoice_lines
    ON invoices.id = invoice_lines.invoice_id

O SQL é detalhado o suficiente sem torná-lo mais detalhado.

Steven Huwig
fonte
Você sabe se o SQL Server oferece suporte para junção natural?
Arry
Eu acho que não. De acordo com connect.microsoft.com/SQLServer/feedback/… parece que a sintaxe está programada para ser adicionada em alguma versão após o SQL Server 2005. Eu sei que funciona no PostgreSQL e no Oracle.
Steven Huwig,
7
Nunca, nunca, nunca use junção natural. Se uma tabela tiver um campo Descrição ao escrever a consulta, tudo bem. Se mais tarde alguém adicionar um campo de descrição à outra tabela, você começará a juntar-se a ele também e quebrará completamente.
1
heh, isso soa como o som da experiência da vida real :)
dland
Eu só usaria junção natural para consultas ad hoc.
Steven Huwig
1

O que eu faço para manter as coisas consistentes para mim (onde uma tabela tem uma única chave primária de coluna usada como o ID) é nomear a chave primária da tabela Table_pk. Em qualquer lugar que eu tenha uma chave estrangeira apontando para a chave primária dessa tabela, eu chamo a coluna PrimaryKeyTable_fk. Dessa forma, eu sei que se eu tiver um Customer_pkna minha tabela Customer e um Customer_fkna minha tabela Order, eu sei que a tabela Order está se referindo a uma entrada na tabela Customer.

Para mim, isso faz sentido especialmente para associações, onde acho que é mais fácil.

SELECT * 
FROM Customer AS c
    INNER JOIN Order AS c ON c.Customer_pk = o.Customer_fk
Ian Andrews
fonte
1

FWIW, nosso novo padrão (que muda, uh, quero dizer "evolui", a cada novo projeto) é:

  • Nomes de campos de banco de dados em minúsculas
  • Nomes de tabelas em maiúsculas
  • Use sublinhados para separar palavras no nome do campo - converta-os para maiúsculas e minúsculas em Pascal no código.
  • pk_ prefixo significa chave primária
  • _id sufixo significa um número inteiro, ID de auto-incremento
  • fk_ prefixo significa chave estrangeira (nenhum sufixo necessário)
  • _VW sufixo para visualizações
  • is_ prefixo para booleanos

Assim, uma tabela denominada nomes podem ter os campos pk_name_id, first_name, last_name, is_alive,e fk_companye uma vista chamada LIVING_CUSTOMERS_VW, definida como:

SELECT first_name, last_name
DE CONTACT.NAMES
WHERE (is_alive = 'True')

Como outros já disseram, praticamente qualquer esquema funcionará, desde que seja consistente e não ofusque desnecessariamente seus significados.

CMPalmer
fonte
0

Eu definitivamente concordo em incluir o nome da tabela no nome do campo ID, exatamente pelos motivos que você forneceu. Geralmente, este é o único campo em que eu incluiria o nome da tabela.

DOK
fonte
0

Eu odeio o nome de id simples. Eu prefiro sempre usar o invoice_id ou uma variante dele. Sempre sei qual é a tabela autorizada para o id quando preciso, mas isso me confunde

SELECT * from Invoice inv, InvoiceLine inv_l where 
inv_l.InvoiceID = inv.ID 
SELECT * from Invoice inv, InvoiceLine inv_l where 
inv_l.ID = inv.InvoiceLineID 
SELECT * from Invoice inv, InvoiceLine inv_l where 
inv_l.ID = inv.InvoiceID 
SELECT * from Invoice inv, InvoiceLine inv_l where 
inv_l.InvoiceLineID = inv.ID 

O pior de tudo é a mistura que você mencionou, totalmente confusa. Tive que trabalhar com um banco de dados onde quase sempre era foo_id, exceto em um dos ids mais usados. Isso foi um inferno total.

Vinko Vrsalovic
fonte
1
Eu li a palavra "fatura" muitas vezes neste post. Parece engraçado agora
Kevin,
2
Ugh, junções implícitas! Eu quero arrancar meus olhos olhando para isso.
HLGEM
0

Eu prefiro DomainName || 'EU IRIA'. (ou seja, DomainName + ID)

DomainName é frequentemente, mas nem sempre, igual a TableName.

O problema com o ID por si só é que ele não é escalonado para cima. Depois de ter cerca de 200 tabelas, cada uma com uma primeira coluna chamada ID, os dados começam a parecer todos iguais. Se você sempre qualifica o ID com o nome da tabela, isso ajuda um pouco, mas não muito.

DomainName & ID podem ser usados ​​para nomear chaves estrangeiras, bem como chaves primárias. Quando as chaves foriegn são nomeadas de acordo com a coluna à qual fazem referência, isso pode ser de ajuda mnemônica. Formalmente, amarrar o nome de uma chave estrangeira à chave que ela faz referência não é necessário, uma vez que a restrição de integridade referencial estabelecerá a referência. Mas é extremamente útil quando se trata de ler consultas e atualizações.

Ocasionalmente, DomainName || 'ID' não pode ser usado, porque haveria duas colunas na mesma tabela com o mesmo nome. Exemplo: Employees.EmployeeID e Employees.SupervisorID. Nesses casos, uso RoleName || 'ID', como no exemplo.

Por último, mas não menos importante, eu uso chaves naturais em vez de chaves sintéticas quando possível. Existem situações em que as chaves naturais não estão disponíveis ou não são confiáveis, mas existem muitas situações em que a chave natural é a escolha certa. Nesses casos, deixo a chave natural assumir o nome que teria naturalmente. Esse nome geralmente nem tem as letras 'ID'. Exemplo: OrderNo, onde No é uma abreviatura para "Número".

Walter Mitty
fonte
0

Para cada tabela, eu escolho uma abreviação de letras de árvore (por exemplo, Funcionários => Emp

Dessa forma, uma chave primária de numeração automática torna-se nkEmp .

É curto, único em todo o banco de dados e conheço exatamente suas propriedades à primeira vista.

Eu mantenho os mesmos nomes em SQL e em todas as linguagens que uso (principalmente C #, Javascript, VB6).

PKario
fonte
0

Consulte as convenções de nomenclatura do site Interakt para um sistema bem pensado de nomenclatura de tabelas e colunas. O método usa um sufixo para cada tabela ( _prdpara uma tabela de produtos ou _ctgpara uma tabela de categorias) e o anexa a cada coluna em uma determinada tabela. Portanto, a coluna de identidade para a tabela de produtos seria id_prde, portanto, única no banco de dados.

Eles vão um passo adiante para ajudar a entender as chaves estrangeiras: A chave estrangeira na tabela de produtos que se refere à tabela de categorias seria de idctg_prdforma que seja óbvio a qual tabela ela pertence (_prd sufixo) e a qual tabela ela se refere (categoria) .

As vantagens são que não há ambigüidade com as colunas de identidade em diferentes tabelas e que você pode dizer rapidamente a quais colunas uma consulta está se referindo pelos nomes das colunas.

flamingLogos
fonte
-2

Você pode usar a seguinte convenção de nomenclatura. Ele tem suas falhas, mas resolve seus problemas particulares.

  1. Use apelidos curtos (3-4 caracteres) para os nomes das tabelas, ou seja, Invoice - inv, InvoiceLines -invl
  2. Nomeie as colunas na tabela usando esses apelidos, ou seja inv_id,invl_id
  3. Para as colunas de referência, use invl_inv_idpara os nomes.

desta forma você poderia dizer

SELECT * FROM Invoice LEFT JOIN InvoiceLines ON inv_id = invl_inv_id
Ilya Kochetov
fonte
5
ick! Eu votaria contra o uso de apelidos curtos para tabelas (ou qualquer outro objeto). Com apelidos, você nunca saberá exatamente qual é o nome curto. Lembre-se de que há muitas maneiras de soletrar errado; só há uma maneira de soletrar certo.
James Curran,
1
James, eu discordo. Se você tem um nome curto que não é descritivo e não consegue se lembrar qual é, então você escolheu o nome errado ou não entende a convenção de nomenclatura que outra pessoa escolheu.
kemiller2002,
2
Use apelidos para obter o mesmo efeito. select * from Invoice inv left join InvoiceLines invl em inv.ID = invl.InvoiceID
yfeldblum
2
Não não não não. alias da tabela com uma abreviação na consulta. Mas o nome da tabela deve ser completo.
Malha de
2
Por que tantos programadores são preguiçosos e parecem que a resposta para tudo é digitar o mínimo possível, só porque é muito difícil digitar um pouco mais.
mP.