Por que prefixar nomes de colunas é considerado uma má prática?

25

De acordo com uma publicação popular do SO, é considerado uma prática ruim prefixar nomes de tabelas. Na minha empresa, cada coluna é prefixada por um nome de tabela. Isso é difícil para mim ler. Não tenho certeza do motivo, mas essa nomeação é realmente o padrão da empresa. Não suporto a convenção de nomenclatura, mas não tenho documentação para fazer backup do meu raciocínio.

Tudo o que sei é que ler o AdventureWorks é muito mais simples. Em esta nossa empresa DB você verá uma tabela, Pessoa e pode ter o nome da coluna:

Person_First_Name
ou talvez até
Person_Person_First_Name (não me pergunte por que você vê a pessoa 2x)

Por que é considerado uma prática ruim pré-corrigir os nomes das colunas? Os sublinhados são considerados maus no SQL também?


Nota: Eu possuo o Pro SQL Server 2008 - design e implementação de banco de dados de relacionamento. As referências a esse livro são bem-vindas.

P.Brian.Mackey
fonte
2
Parece que quem fez essas regras não estava ciente da função de alias.
ba__friend
@ Daniel Pryden - eu usei palavras pobres. Pergunta atualizada.
precisa
Um tipo semelhante de postagem aqui stackoverflow.com/questions/465136/…
@ba__friend - Você pode me dar alguns detalhes sobre esse comentário?
usar o seguinte
1
A palavra essencial que você usou é Padrão. Se você mudar uma prática padrão, terá inconsistência. Você acredita sinceramente que qualquer mudança nessa prática padrão vale a inconsistência resultante? O status quo é realmente pior do que isso?

Respostas:

44

Sublinhados não são maus, apenas mais difíceis de digitar. O que é ruim é mudar os padrões no meio do caminho sem consertar todos os objetos existentes. Agora você tem personId, Person_id, etc. e não consegue se lembrar de qual tabela usa sublinhados ou não. A consistência na nomeação (mesmo que você não goste dos nomes) ajuda a facilitar a codificação.

Pessoalmente, o único lugar em que sinto a necessidade de usar o nome da tabela em uma coluna é na coluna ID (o uso de apenas ID é um antipadrão no design de banco de dados, como qualquer pessoa que tenha feito consultas extensas sobre relatórios pode lhe dizer. É muito divertido renomear 12 colunas na sua consulta sempre que você escreve um relatório.) Isso também facilita o conhecimento imediato dos FKs em outras tabelas, pois eles têm o mesmo nome.

No entanto, em um banco de dados maduro, é mais trabalhoso do que vale a pena alterar um padrão existente. Basta aceitar que esse é o padrão e seguir em frente, há coisas muito mais críticas que precisam ser corrigidas primeiro.

HLGEM
fonte
4
É verdade, mas um banco de dados sem padrão de nomenclatura consistente é muito mais difícil de consultar do que um com um padrão ruim que é aplicado de maneira consistente.
HLGEM
2
Eu concordo parcialmente. Se o banco de dados é enorme, mantenha o padrão. Mas passo meu tempo lendo mais do que escrevendo e o prefixo do nome da tabela parece mais barulho para filtrar. Se fosse eu e soubesse que eu poderia refatorá-lo dentro de alguns dias ou uma semana, certamente o faria. Mas muitas vezes você não tem esse luxo e precisa codificar produção, produção, produção.
Programador
3
@jason, você pode quebrar mais do que pensa fazer isso. Os bancos de dados geralmente são acessados ​​por muitas coisas que o programador de aplicativos não tem conhecimento. Coisas como importação de dados de clientes ou outros dbs e exportação para clientes e / ou datawarehouses, outros aplicativos, relatórios, etc. Você pode se acostumar a ler qualquer padrão em questão de horas e refatorar-se de um padrão de empresa aprovado sem um acordo para mudar para um novo padrão faria com que você fosse demitido na maioria dos lugares. Honestamente, a menos que o banco de dados esteja em sua infância, é melhor usar o padrão existente, quer você goste ou não.
HLGEM
7
@jason, sou uma pessoa de banco de dados, somos amplamente conhecidos por não ter senso de aventura!
HLGEM
2
Concordo totalmente com TableName.Id sendo um antipadrão. Ter trabalhado dentro e fora desse padrão tempo suficiente para que eu possa confidentelly dizer erros / confusão ocorre com TableName.Id que não ocorrem com TableName.TableNameId
AaronLS
16

Um argumento para a prefixação do nome da coluna evitaria "colisões" de nome ao ingressar em várias tabelas E quando o criador da consulta não usar aliases.

SELECT person.name, company.name FROM person JOIN company ON ...

SELECT * FROM person JOIN company ON ...

Ambas as consultas teriam duas colunas "nome" ( nome_1, nome_2 ) sem "informar" a que entidade pertence. E você nunca pode ter certeza dos nomes das colunas geradas (será name_2 ou name_3 ou ...). Se você usar o nome da tabela prefixação, os nomes das colunas seria PERSON_NAME , company_name para que você saiba cada nome ao qual entidade a que pertence, e você sabe que os nomes das colunas permanecerá constante (se você está recebendo-os em Java usando JDBC, por exemplo, )

Ambos os argumentos podem ser ignorados se você usar alias, mas acho que a maioria das convenções de codificação aplicadas nas empresas é uma consequência de muitos programadores (juniores) que não seguem boas práticas. Nesse caso, por exemplo, o uso do curinga em uma instrução SELECT pode causar problemas sem o prefixo do nome.

Quanto ao sublinhado nos nomes de tabelas e colunas, eu o uso extensivamente porque uso apenas letras minúsculas nos nomes e sublinhado como separador. Usar apenas letras minúsculas ajuda a distinguir identificadores das palavras-chave SQL (que eu digito todas em maiúsculas):

SELECT person_name, COUNT(bought_product) FROM bought_products WHERE person_name LIKE 'A%'
Nicolae Albu
fonte
6
Eu adoraria se todas as colunas com as mesmas informações em tabelas diferentes tivessem exatamente o mesmo nome e que sempre que você usar mais de 1 alias de tabela, seria o padrão imposto. Cansado de lembrar para qual tabela os mapas patid, Patientid, pat_id, id_pat ou ptatient_id.
26912 Pieter B
1
Eu nunca escrevo uma consulta de produção sem usar o alias de todas as colunas. Isso facilita muito a manutenção. É claro que escrevo consultas complicadas do tipo relatório / exportação com até 10 a 20 junções e 30 a 50 colunas e seis meses depois é difícil lembrar de qual tabela essa coluna veio.
HLGEM
8

Adicionar esse tipo de prefixo aos nomes das colunas tornará a tabela mais difícil de evoluir. Como exemplo: se, eventualmente, você perceber que deseja / precisa alterar o nome da tabela, precisará modificar toda a estrutura da tabela (ou seja, não apenas o nome da tabela, mas o nome de todas as suas colunas). Isso também tornaria mais difícil atualizar os índices da tabela e o código dos clientes que a consultam.

Sergio
fonte
4

Existem exceções, se usadas criteriosamente (conforme a resposta de Patrick Karcher no seu link) para nomes de colunas comuns (normalmente apenas ID, às vezes Nome) que seriam ambíguos com muita frequência .

Outra prática recomendada é sempre qualificar colunas e objetos em suas consultas. Portanto, os prefixos de coluna se tornam discutíveis e desorganizam seu código.

Compare estes: qual é o mais fácil para os olhos?

SELECT P.name, P.Salary FROM dbo.Person P

SELECT Person.Name, Person.Salary FROM dbo.Person Person

SELECT dbo.Person.name, dbo.Person.Salary FROM dbo.Person

SELECT Person.Person_name, Person.Person_Salary FROM dbo.Person Person
gbn
fonte
3
Definitivamente o primeiro ... :)
ErikE
3
Que tal SELECT name, salary FROM dbo.Person? : P
cHao
1
@cHao: tente criar uma visão COM ESQUEMA sobre isso ...
gbn
@gbn: Funciona bem para mim. CREATE VIEW [dbo].[vwMeritPercentage] with schemabinding AS SELECT [Performance Score] as dblMinScore, ISNULL(( SELECT TOP 1 [Performance Score] FROM dbo.Budget b WHERE b.[Performance Score] > budget.[Performance Score] ORDER BY [Performance Score] ), 100.00) as dblMaxScore, [Merit Minimum] as dblMinPercentage, [Merit Midpoint] as dblBudgetPercentage, [Merit Maximum] as dblMaxPercentage FROM dbo.Budget;
cHao
1
Documentação relevante ( msdn.microsoft.com/en-us/library/ms187956(v=SQL.105).aspx ): "Quando você usa SCHEMABINDING, a instrução select_st deve incluir os nomes de duas partes (schema.object) das tabelas, visualizações ou funções definidas pelo usuário que são referenciadas ". Observe que as colunas não exigem nomes pontilhados (a menos que sejam necessárias para resolver ambiguidades na consulta) ... apenas tabelas, visualizações e funções.
cHao
3

Em geral, realmente não parece haver nenhum padrão onipresente. A pergunta à qual você se vinculou tem várias respostas votadas com convenções totalmente diferentes. É claro que todos defenderão seus próprios padrões e é muito mais importante manter convenções consistentes em um projeto.

Dito isto, prefixar nomes de colunas parece ser um exagero. Você já sabe em qual tabela está trabalhando e uma situação com duas colunas de tabelas diferentes com o mesmo nome pode ser facilmente resolvida usando aliases de tabela ou coluna.

Dan Simon
fonte
2

No TSQL, você pode consultar os campos no formato TableName.FieldName, se desejar evitar ambigüidades, portanto, adicionar nomes de tabelas aos nomes de campos diminui a legibilidade, tornando-os TableName.TableName_FieldName ou similares. Eu acho que usar sublinhados ou não é mais uma escolha pessoal. Eu prefiro o CamelCase e uso _ quando eu quiser adicionar um sufixo ou similar, por exemplo, TableName_Temp, mas isso é só comigo.

Ben Robinson
fonte
2

Certa vez, trabalhei em um sistema em que decidimos usar códigos curtos para prefixar as colunas. Os campos PK usavam o "nome completo da tabela" como prefixo e todas as outras colunas usavam de 2 a 4 caracteres consistentemente como prefixo. Cada coluna também usou um domínio de dados como sufixo. Se feito de forma consistente, pode ser muito agradável e limpo. Não faz sentido que um padrão de nomenclatura de um tipo ou outro implique codificação desleixada. A presença de um padrão consistente é o que é importante. Eu já vi vários bancos de dados inconsistentes porque não há um padrão claro e que mais do que qualquer outra coisa me indicaria que pode haver problemas nas estruturas de dados. Se o designer de um banco de dados não puder nem mesmo nomear objetos de forma consistente e seus filhos,

Tom
fonte
1

Prefixar é uma prática ruim porque causa o problema que foi projetado para evitar. Como você afirmou, é muito difícil ler colunas prefixadas. Se você terminar com nomes de colunas duplicados em uma consulta na qual você une duas tabelas, poderá resolvê-las, ou é uma visão, procedimento armazenado ou função tabular definida pelo usuário que faz isso por você, se você estiver constantemente juntando tabelas específicas.

Tanto quanto usar sublinhado em um nome de tabela, esse é um argumento religioso. No final, aumenta a visibilidade e facilita as coisas. Eu geralmente nunca teria espaços ou tabelas em um nome de coluna ou tabela. No entanto, posso abrir uma exceção para tabelas ou visualizações que foram usadas apenas por um pacote de relatórios ou exportadas para um arquivo CSV.

Justin Dearing
fonte
1

Muitos bancos de dados têm limites estritos no número de caracteres no nome de uma coluna (ou seja, Oracle).

Se você estiver trabalhando com um banco de dados que permita nomes longos de colunas, mas depois decidir que deseja migrar essa estrutura para outro sistema de banco de dados, os prefixos aumentarão as chances de os nomes de suas colunas serem inválidos.

Embora você esteja trabalhando com o SQL Server agora, ninguém pode prever o futuro, e é possível que seu software precise trabalhar em vários bancos de dados no futuro.

Britt Wescott
fonte
0

Considere escrever um dicionário de dados (ou "registro"). Por isso, quero dizer um documento contendo todos os elementos de dados em seu modelo: nome, descrição etc. Ele deve ser independente da implementação do modelo, por exemplo, não deve mencionar nomes de tabelas. Como você desambiguaria nomes como 'ID', 'Tipo' e 'Código'?

Uma abordagem é seguir as diretrizes da norma internacional ISO / IEC 11179 - afinal, por que reinventar a roda? A estrutura básica é:

[Object] [Qualifier] Property RepresentationTerm

com delimitadores entre os elementos: o SQL não funciona bem com espaços nos nomes das colunas e o sublinhado funciona bem visualmente.

Sinto que alguém da sua organização estava tentando seguir essas diretrizes quando criaram nomes de elementos como Person_Person_First_Name.

O exemplo que eu gosto de mostrar é o dicionário de dados do Serviço Nacional de Saúde das Nações Unidas (NHS) .

Portanto, não acho que a convenção de nomenclatura com a qual você tenha que trabalhar seja muito ruim.

Na implementação, por exemplo, no SQL, algumas pessoas gostam de omitir os subelementos Objeto, Qualificador e Propriedade quando o nome da tabela fornece contexto, por exemplo, person_first_namefica first_namena Persontabela etc. No entanto, a regra geral de que um elemento de dados não deve mudar seu nome simplesmente devido à sua localização no modelo físico parece ser bom. Qualquer pessoa que ache que não é uma boa ideia seguir esta regra deve ter a tarefa de documentar todas as variações de nome que eles usaram :)

Você encontrará um bom resumo da ISO 11179 no livro Estilo de programação de Joe Celko , incluindo evidências de preferência por sublinhados como delimitadores nos nomes das colunas.

um dia quando
fonte
0

Alguns acham mais fácil no código saber de que tabela os dados vieram; no entanto, se você estiver falando de um sistema orientado a objetos, deverá usar o contexto do nome para saber de onde eles vêm;

Pessoalmente, a prefixação do nome da tabela é uma indicação de que os desenvolvedores não são muito habilidosos e, à medida que você avança, você encontrará muitas outras convenções ruins de codificação e se eu tivesse que adivinhar que o aplicativo tem muitas tabelas, é buggy etc.

Bill Leeper
fonte