Estou começando a trabalhar com chaves estrangeiras pela primeira vez e estou imaginando se existe um esquema de nomenclatura padrão a ser usado para elas.
Dadas estas tabelas:
task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)
Onde as Tarefas têm Notas, elas pertencem a Usuários, e os Usuários criam Notas.
Como as três chaves estrangeiras seriam nomeadas nessa situação? Ou, alternativamente, isso importa mesmo ?
Atualização : Esta pergunta é sobre nomes de chaves estrangeiras, não nomes de campos!
Respostas:
A convenção padrão no SQL Server é:
Assim, por exemplo, a chave entre notas e tarefas seria:
E a chave entre tarefas e usuários seria:
Isso fornece uma visão rápida de quais tabelas estão envolvidas na chave, facilitando a visualização de quais tabelas uma em particular (a primeira nomeada) depende (a segunda nomeada). Nesse cenário, o conjunto completo de chaves seria:
Assim, você pode ver que as tarefas dependem dos usuários e as notas dependem das tarefas e dos usuários.
fonte
message
tabela tem umfrom_user_id
eto_user_id
ambos se tornariamfk_message_user
. Parece-me melhor usarfk_tablename_columnname
(fk_message_from_user_id no meu exemplo) por esse motivo e, em seguida, tente manter os nomes das colunas claros sobre a tabela de destino (por exemplo, to_user_id está claramente se referindo à tabela de usuários)Eu uso dois caracteres sublinhados como delimitador ou seja
Isso ocorre porque os nomes das tabelas ocasionalmente conterão caracteres de sublinhado. Isso segue a convenção de nomenclatura para restrições geralmente porque os nomes dos elementos de dados freqüentemente contêm caracteres sublinhados, por exemplo
fonte
Que tal
FK_TABLENAME_COLUMNNAME
?K eep I t S exe S tupid sempre que possível.
fonte
FK_Animals_OwnerID
-Animais e mesa de Proprietários, definidos na coluna OwnerIDUma observação da Microsoft sobre o SQL Server:
portanto, usarei termos que descrevem dependência em vez dos termos convencionais de relacionamento primário / externo.
Ao fazer referência à PRIMARY KEY da tabela independente (pai) pelas colunas com nomes semelhantes na tabela dependente (filho) , omito o (s) nome (s) da coluna:
Ao fazer referência a outras colunas, ou os nomes das colunas variam entre as duas tabelas, ou apenas para ser explícito:
fonte
Normalmente, apenas deixo meu ID nomeado PK e concateno o nome da tabela e o nome da coluna-chave ao nomear FKs em outras tabelas. Eu nunca me importo com o revestimento de camelo, porque alguns bancos de dados descartam a distinção entre maiúsculas e minúsculas e simplesmente retornam todos os nomes em maiúsculas ou minúsculas de qualquer maneira. De qualquer forma, veja como seria minha versão de suas tabelas:
Observe que eu também nomeio minhas tabelas no singular, porque uma linha representa um dos objetos que estou persistindo. Muitas dessas convenções são de preferência pessoal. Eu sugiro que é mais importante escolher uma convenção e sempre usá-la, do que adotar a convenção de outra pessoa.
fonte
Provavelmente isso é exagero, mas funciona para mim. Isso me ajuda bastante quando estou lidando especialmente com VLDBs. Eu uso o seguinte:
Obviamente, se por algum motivo você não estiver fazendo referência a uma chave primária, deverá fazer referência a uma coluna contida em uma restrição exclusiva, neste caso:
Pode demorar, sim. Isso ajudou a manter as informações claras para os relatórios ou me deu um pulo rápido em que o possível problema ocorre durante um alerta de prod 100% adoraria saber o que as pessoas pensam sobre esta convenção de nomenclatura.
fonte
Minha abordagem usual é
Ou em outros termos
Dessa forma eu posso citar duas chaves estrangeiras que fazem referência à mesma mesa como um
history_info table
comcolumn actionBy and actionTo
deusers_info
mesaSerá como
Observe que:
Não incluí o nome da tabela filho porque parece bom senso para mim; estou na mesa da criança para poder assumir facilmente o nome da tabela da criança. O caráter total dele é 26 e se encaixa bem no limite de 30 caracteres do oracle, que foi declarado por Charles Burns em um comentário aqui
fonte
Com base nas respostas e comentários aqui, uma convenção de nomenclatura que inclui a tabela FK, o campo FK e a tabela PK (FK_FKTbl_FKCol_PKTbl) deve evitar colisões de nomes de restrições FK.
Portanto, para as tabelas fornecidas aqui:
Portanto, se você adicionar uma coluna para rastrear quem modificou pela última vez uma tarefa ou uma nota ...
fonte
Se você não está referenciando seus FKs com tanta frequência e usando o MySQL (e o InnoDB), pode deixar o MySQL nomear o FK para você.
Posteriormente, você poderá encontrar o nome FK necessário executando uma consulta .
fonte
Tente usar o UUID da versão 4 de caixa alta com o primeiro octeto substituído por FK e '_' (sublinhado) em vez de '-' (traço).
Por exemplo
FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
FK_1786_45A6_A17C_F158C0FB343E
FK_45A5_4CFA_84B0_E18906927B53
A justificativa é a seguinte
fonte