Em nosso grupo de desenvolvimento, temos um intenso debate sobre a convenção de nomenclatura para chaves primárias e estrangeiras. Existem basicamente duas escolas de pensamento em nosso grupo:
1:
Primary Table (Employee)
Primary Key is called ID
Foreign table (Event)
Foreign key is called EmployeeID
ou
2:
Primary Table (Employee)
Primary Key is called EmployeeID
Foreign table (Event)
Foreign key is called EmployeeID
Prefiro não duplicar o nome da tabela em nenhuma das colunas (portanto, prefiro a opção 1 acima). Conceitualmente, é consistente com muitas das práticas recomendadas em outras linguagens, onde você não usa o nome do objeto em seus nomes de propriedade. Eu acho que nomear a chave estrangeira EmployeeID
(ouEmployee_ID
pode ser melhor) informa ao leitor que é a ID
coluna da Employee
Tabela.
Alguns outros preferem a opção 2, onde você nomeia a chave primária prefixada com o nome da tabela para que o nome da coluna seja o mesmo em todo o banco de dados. Eu entendo esse ponto, mas agora você não pode distinguir visualmente uma chave primária de uma chave estrangeira.
Além disso, acho que é redundante ter o nome da tabela no nome da coluna, porque se você pensar na tabela como uma entidade e uma coluna como uma propriedade ou atributo dessa entidade, você pensa nela como o atributo ID do Employee
, não o EmployeeID
atributo de um funcionário. Eu não pergunto ao meu colega de trabalho o que é PersonAge
ouPersonGender
é é. Eu pergunto a ele qual é a sua idade.
Então, como eu disse, é um debate intenso e continuamos e continuamos sobre isso. Estou interessado em obter algumas novas perspectivas.
Respostas:
Realmente não importa. Nunca me deparei com um sistema em que haja uma diferença real entre as opções 1 e 2.
Jeff Atwood escreveu um ótimo artigo há algum tempo sobre esse assunto. Basicamente, as pessoas debatem e argumentam com mais fúria aqueles tópicos sobre os quais não se pode provar que estão errados. Ou, de um ângulo diferente, aqueles tópicos que só podem ser vencidos por meio de argumentos de resistência baseados no estilo obstrucionista.
Escolha um e diga a eles para se concentrarem nos problemas que realmente afetam seu código.
EDITAR: Se você quiser se divertir, peça-lhes que especifiquem detalhadamente por que seu método é superior para referências de tabela recursivas.
fonte
Se as duas colunas têm o mesmo nome em ambas as tabelas (convenção # 2), você pode usar a sintaxe USING em SQL para economizar digitação e alguns ruídos clandestinos:
Outro argumento a favor da convenção nº 2 é que essa é a forma como o modelo relacional foi projetado.
fonte
SELECT name, address, amount FROM employees NATURAL JOIN payroll
.employee_id
.Acho que depende de como o aplicativo é elaborado. Se você usa ORM ou projeta suas tabelas para representar objetos, a opção 1 pode ser para você.
Gosto de codificar o banco de dados como sua própria camada. Eu controlo tudo e o aplicativo apenas chama procedimentos armazenados. É bom ter conjuntos de resultados com nomes de colunas completos, especialmente quando há muitas tabelas unidas e muitas colunas retornadas. Com esse tipo de aplicativo, gosto da opção 2. Gosto muito de ver os nomes das colunas coincidirem nas junções. Trabalhei em sistemas antigos onde eles não combinavam e foi um pesadelo,
fonte
Nenhuma das convenções funciona em todos os casos, então por que ter uma? Use o senso comum...
por exemplo, para a tabela de auto-referência, quando há mais de uma coluna FK que faz referência ao PK da mesma tabela, você TEM que violar os dois "padrões", já que as duas colunas FK não podem ter o mesmo nome ... , EmployeeTable with EmployeeId PK, SupervisorId FK, MentorId Fk, PartnerId FK, ...
fonte
Concordo que há pouco a escolher entre eles. Para mim, uma coisa muito mais significativa sobre qualquer um dos padrões é a parte "padrão".
Se as pessoas começarem a 'fazer suas próprias coisas', elas devem ser amarradas por suas forças. NA MINHA HUMILDE OPINIÃO :)
fonte
Você considerou o seguinte?
fonte
table_name.column_name
em consultas e não precisará usar alias para nomes de coluna se não tiver nomes repetidos ...A convenção que usamos onde trabalho é muito próxima de A, com a exceção de que nomeamos as tabelas no plural (ou seja, "funcionários") e usamos sublinhados entre a tabela e o nome da coluna. A vantagem disso é que, para se referir a uma coluna, ela pode ser "funcionários _ id" ou "funcionários.id", dependendo de como você deseja acessá-la. Se você precisar especificar de qual tabela a coluna está vindo, "workers.employees _ id" é definitivamente redundante.
fonte
Se você está olhando para o código do aplicativo, não apenas para consultas de banco de dados, algumas coisas parecem claras para mim:
As definições de tabela geralmente são mapeadas diretamente para uma classe que descreve um objeto, portanto, devem ser singulares. Para descrever uma coleção de um objeto, geralmente acrescento "Array" ou "List" ou "Collection" ao nome no singular, pois mais claramente do que o uso de plurais indica não apenas que se trata de uma coleção, mas que tipo de coleção isto é. Nessa visão, vejo um nome de tabela não como o nome da coleção, mas o nome do tipo de objeto do qual é uma coleção. Um DBA que não escreve o código do aplicativo pode perder esse ponto.
Os dados com os quais lido frequentemente usam "ID" para fins de identificação não relacionados à chave. Para eliminar a confusão entre "ID" s de chave e "ID" não chave, para o nome da chave primária, usamos "Chave" (é isso que é, não é?) Prefixada com o nome da tabela ou uma abreviatura de o nome da tabela. Este prefixo (e eu reservo isso apenas para a chave primária) torna o nome da chave único, o que é especialmente importante porque usamos nomes de variáveis que são iguais aos nomes das colunas do banco de dados, e a maioria das classes tem um pai, identificado pelo nome de a chave pai. Isso também é necessário para garantir que não seja uma palavra-chave reservada, o que é "Chave" por si só. Para facilitar a manutenção de nomes de variáveis-chave consistentes e para fornecer programas que fazem junções naturais, as chaves estrangeiras têm o mesmo nome que é usado na tabela na qual são a chave primária. Eu encontrei mais de uma vez programas que funcionam muito melhor dessa forma usando junções naturais. Sobre este último ponto, admito um problema com as tabelas de autorreferência, que usei. Nesse caso, eu faria uma exceção à regra de nomenclatura de chave estrangeira. Por exemplo, eu usaria ManagerKey como uma chave estrangeira na tabela Employee para apontar para outro registro nessa tabela.
fonte
Gosto da convenção nº 2 - ao pesquisar este tópico e encontrar esta questão antes de postar a minha, encontrei o seguinte problema:
Estou selecionando * em uma tabela com um grande número de colunas e unindo-a a uma segunda tabela que, da mesma forma, possui um grande número de colunas. Ambas as tabelas têm uma coluna "id" como chave primária, o que significa que tenho que escolher especificamente cada coluna (até onde eu sei) para tornar esses dois valores únicos no resultado, ou seja:
Embora usar a convenção nº 2 signifique que ainda terei algumas colunas no resultado com o mesmo nome, agora posso especificar qual id preciso (pai ou filho) e, como sugeriu Steven Huwig, a
USING
instrução simplifica ainda mais as coisas.fonte
SELECT *
é um não-não para (a maioria) das consultas de produção, de qualquer maneira, então isso não é muito motivo para escolher um padrão de nomenclatura.SELECT *
é um não-não para a maioria das consultas de produção. Se aumenta significativamente a velocidade de desenvolvimento e torna o código muito mais conciso e legível - permitindo que você se concentre em assuntos mais importantes - por que nãoSELECT *
? Depende muito das circunstâncias de cada situação e é uma troca entre muitos fatores. Uma regra raramente se ajusta a tudo.Sempre usei userId como PK em uma tabela e userId em outra tabela como FK. estou pensando seriamente em usar userIdPK e userIdFK como nomes para identificar um do outro. Isso vai me ajudar a identificar PK e FK rapidamente ao olhar as tabelas e parece que vai limpar o código ao usar PHP / SQL para acessar dados, tornando-os mais fáceis de entender. Especialmente quando alguém olha meu código.
fonte
Eu uso a convenção nº 2. Estou trabalhando com um modelo de dados legado agora, onde não sei o que significa em uma determinada tabela. Onde está o mal em ser prolixo?
fonte
Que tal nomear a chave estrangeira
role_id
onde papel é o papel que a entidade referenciada tem em relação à tabela em questão. Isso resolve o problema de referência recursiva e vários fks para a mesma tabela.
Em muitos casos, será idêntico ao nome da tabela referenciada. Nestes casos, torna-se idêntico a uma de suas propostas.
Em qualquer caso, ter longos argumentos é uma má ideia
fonte
"Onde em" ordem INNER JOIN do funcionário ON order.employee_id = employee.id "há necessidade de qualificação adicional?".
Não há necessidade de qualificação adicional porque a qualificação de que falei já existe.
“a razão pela qual um usuário de negócios se refere a Order ID ou Employee ID é para fornecer contexto, mas em um nível de banco de dados você já tem contexto porque está se referindo à tabela”.
Por favor, diga-me, se a coluna se chama 'ID', então como isso "referindo [sic] à mesa" é feito exatamente, a não ser qualificando esta referência para a coluna ID exatamente da maneira que eu falei?
fonte