A adição do prefixo 'tbl' aos nomes das tabelas é realmente um problema?

92

Estou assistindo a alguns vídeos de Brent Ozar ( como este, por exemplo ) e ele sugere não prefixar tabelas com ‘tbl’or ‘TBL’.

Na internet, encontrei alguns blogs dizendo que isso não acrescenta nada à documentação e também que "leva mais tempo para lê-la".

Perguntas e considerações

  • Isso realmente é um problema? Porque prefixo as tabelas com 'tbl' desde o meu primeiro trabalho de dba (o DBA sênior me disse para fazer isso na organização).
  • Isso é algo que eu preciso me livrar? Fiz alguns testes, copiando uma tabela muito grande e fornecendo o prefixo 'tbl', mantendo a outra sem ela e não notei nenhum problema de desempenho.
Racer SQL
fonte
66
Contra-pergunta: Você prefixa todas as suas classes na sua linguagem de programação (Java, C ++, Scala, ....) com Class?
a_horse_with_no_name
78
Quando eles "levam mais tempo para ler" , não significam problemas de desempenho. Demora mais tempo para os humanos lerem o código. O que é mais fácil de ler? Esta frase: Wrdthis wrdis wrda wrdsimple wrdsentence. ou esta This is a simple sentence.:?
precisa saber é o seguinte
3
Isto pode estar relacionado: stackoverflow.com/questions/111933/…
Walfrat 4/11/16
42
Aqui está um caso prático contra isso. Muitas vezes, é útil digitar a primeira letra do nome da tabela para entrar em uma lista. Quando todas as tabelas começam com 't', isso não funciona mais. Da mesma forma, também não o ajudará com o IntelliSense.
shawnt00
30
Eu não sou um DBA, sou um programador. Mas por favor não faça isso. Você está me deixando mais lento e dificultando a leitura e a manutenção do meu código. E para quê? Não vejo nenhum benefício.
Dawood ibn Kareem

Respostas:

217

Uma vez eu tive uma mesa e era brilhante e bonita. Ele realizou todas as transações financeiras de uma organização. E então começamos a carregar dados nele.

No mês atual, eles podem declarar e reafirmar valores quantas vezes quiserem. Nos 10 dias finais de um mês, eles atualizavam os números -> executavam o processamento ETL -> revisavam os relatórios várias vezes ao dia. Depois que o mês termina, os livros são selados e eles não podem modificar valores.

É incrível a quantidade de dados financeiros que uma empresa de serviços financeiros gera ... Algo que não percebemos com nosso conjunto de dados de teste foi o volume de dados que tornaria insustentáveis ​​os procedimentos de final de mês. Demorou cada vez mais tempo para excluir os "dados do mês atual" antes de substituí-los pela nova versão de avaliação.

Tivemos que fazer algo para tornar o processamento mais rápido, sem quebrar a lista não catalogada de "quem sabe o quê", tudo isso depende da tabela MonthlyAllocation. Decidi brincar de mago e sacar a toalha debaixo deles. Eu fui à escola antiga e usei uma Vista Particionada . Os dados já tinham um sinalizador IsComplete, então eu criei duas tabelas - cada uma com restrições de verificação contrárias: MonthlyAllocationComplete, MonthlyAllocationInComplete

Criei a exibição particionada com o mesmo nome da tabela original: MonthlyAllocation. Nenhum processo foi mais sensato sobre as mudanças físicas que fizemos no banco de dados. Nenhum relatório foi quebrado, nenhum dos analistas com acesso direto relatou problemas com essa "tabela" antes ou depois.

História legal mano, mas onde você está indo?

E se eles tivessem uma convenção de nomenclatura lá, tbl_MonthlyAllocation? O que agora? Passamos muitas horas de trabalho analisando todos os ETL, todos os relatórios, todas as planilhas ad-hoc da organização e atualizando-as para usar vw_MonthlyAllocation? E é claro que todas essas mudanças passam pelo Quadro de Mudanças, e esse é sempre um processo rápido e indolor.

Seu chefe pode perguntar: Qual é a recompensa para a empresa por todo esse trabalho novamente?

A outra opção é deixarmos essa visualização nomeada como tbl_ e não gastar todo esse tempo testando, atualizando e implantando o código. O que se torna uma anedota divertida que você explica para todos os novos contratados e aqueles com pouco tempo de atenção que precisam trabalhar com o banco de dados e saber por que você é inconsistente com a nomeação de objetos.

Ou você não duplica a codificação de objetos com metadados redundantes. O banco de dados informará com prazer o que é uma tabela, o que é uma visualização, o que é uma função com valor de tabela etc.

As convenções de nomenclatura são boas, apenas não se ponha de lado com elas.

billinkc
fonte
132

Brent aqui (o cara a quem você está se referindo na pergunta).

A razão pela qual eu digo para você não adicionar tbl à frente dos nomes de suas tabelas é a mesma razão que eu diria para não adicionar child à frente do nome do seu filho. Você não os chama de childJohn e childJane. Além de não agregar valor, elas podem não ser crianças mais tarde na vida - e seus objetos podem se tornar vistas posteriormente.

Brent Ozar
fonte
10
Se você estiver escrevendo uma instrução insert, eu realmente espero que você já sabe se a coisa que você está inserindo é uma tabela ou uma vista ...
Joe
@ Joe: "Espero que você saiba se o que você está inserindo é uma tabela ou uma exibição" - há circunstâncias em que você pode estar inserindo em uma exibição e seu código não deve se importar (alguns mecanismos suportam a manipulação de dados em visualizações bastante simples, e os instead ofacionadores podem possibilitar exemplos mais complicados). Embora isso ainda aponte para não precisar / querer o prefixo do nome.
David Spillett
119

Este é um argumento muito subjetivo, mas aqui está minha opinião: o prefixo tbl é inútil.

Quantos cenários você está vendo código e não sabe se algo é uma tabela ou algo mais?

Que valor o tbl adiciona, exceto que, quando você olha para uma lista de tabelas no Pesquisador de Objetos, precisa trabalhar mais para encontrar as que procura?

Algumas pessoas dizem que querem que fique claro em seu código quando estão lidando com uma tabela ou uma exibição. Por quê? E se isso é importante, por que não apenas nomear visualizações de uma maneira especial? Na maioria dos casos, eles agem exatamente como tabelas, por isso vejo pouco valor em distinguir.

Aaron Bertrand
fonte
11
Por exemplo, no PostgreSQL, uma visão também é, na realidade, uma tabela: postgresql.org/docs/9.6/static/rules-views.html - então a diferença é ainda menos importante.
Dezső
42

É uma prática terrível.

tbl
tbl_
Table_
t_

... vi todos eles em produção.

Um dos produtos com os quais estou trabalhando atualmente tem metade das tabelas nomeadas tbl_whatevere a outra metade denominada "normalmente" - obviamente eles têm desenvolvedores que trabalham com padrões diferentes. Outro de seus maus hábitos é prefixar nomes de colunas com chaves estrangeiras fk, seguidos pelo nome da tabela e fkdepois pelo nome da coluna, fornecendo nomes horríveis para colunas como fktbl_AlarmsfkAlarmsID. Essa convenção de nomenclatura é apenas uma extensão lógica de todo o tbl_%mantra, e você pode ver como é ridículo!

Eu quase me esqueci do outro banco de dados que me faz chorar diariamente. Tipos de dados que prefixam os nomes das colunas ... dtPaymentDate, porque o nome realmente precisava do dtprefixo? `

Philᵀᴹ
fonte
22
Pelo menos você não está trabalhando com um banco de dados sensíveis caso para tbl_Foo e Tbl_Foo não são entidades diferentes ...
billinkc
23

NÃO ESCUTE PREPARA AJUSTAR AQUELES ADAPTADORES OUTRAS PESSOAS. proYou auxDeverá sempre usar outros prefixos prepWith proYour adjTable nouNames. proI auxHave advEven VerStarted gerUsing proThem prepIn adjNormal NouWriting.

COMO CONSULTAR ADVERTÊNCIAS DE PROPRIEDADES ADJETIVAS? outras pessoas podem entender seu novo ajuste de escritaMelhor!

ErikE
fonte
Vamos continuar esta discussão no chat .
sampathsris
21

Usar um prefixo como esse é conhecido como Notação Húngara . Sua premissa é simples: você pode determinar o que é algo pelo nome. Isso é particularmente comum em linguagens de programação, especialmente quando os desenvolvedores escrevem funções monolíticas que abrangem dezenas de páginas, por falta de habilidade ou falta de recursos da linguagem. É uma ajuda mnemônica que ajuda os desenvolvedores a manter os tipos de dados corretos.

De um modo geral, é provável que esse estilo de nomeação seja usado em códigos realmente antigos ou por desenvolvedores que estão apenas aprendendo (e aprenderam esse hábito), ou que estão fazendo isso desde que se lembram. Na minha experiência, observei que é relativamente raro ver a notação húngara surgir espontaneamente com desenvolvedores inexperientes, se não forem apresentados a ela por um curso ou tutorial de programação; é mais provável que eles usem nomes de variáveis ​​como i ou x ou acct .

Além de se pintar em um canto, isso é realmente apenas preenchimento. A sintaxe SQL é precisa o suficiente para que um desenvolvedor sempre saiba se está falando de um campo, registro ou conjunto de dados (que pode ser uma tabela, exibição etc.). Embora possa ser uma excelente ajuda para o ensino, essa sintaxe geralmente não deveria existir nos bancos de dados de produção. Isso pode prejudicar a legibilidade e dificultar a localização da tabela que você procura, especialmente se vários temas de nomeação alternativos aparecerem, como tbl vs. table vs. tab etc.

O banco de dados realmente não se importa com o que você chama de tabelas, campos etc. Eles são apenas bytes de dados organizados em uma ordem específica por seus operadores ou scripts humanos. No entanto, os humanos que precisam manter esses dados apreciarão nomes significativos, como "usuário", "ordem" e "conta". Também é mais prático se você estiver usando consultas SQL, como "show table like 'a%'". O uso de prefixos e sufixos pode complicar desnecessariamente a manutenção trivial.

phyrfox
fonte
14
Como muitos que abusam da notação húngara, sua resposta contra ela perde completamente a diferença entre o Apps Hungarian e o Systems Hungarian.
Ben Voigt
8
@BenVoigt, muito verdadeiro. Mas você esqueceu o link obrigatório .
Curinga
12

Li algumas postagens no blog como esta ou esta (há algumas) depois que herdei minha primeira instância do SQL Server e notei muitos objetos com prefixo. Eu queria começar a desenvolver novos com uma abordagem menos detalhada e uma convenção de nomenclatura singular ( muito mais fácil para mim [ e possivelmente outros desenvolvedores ] trabalhar no mapeamento relacional de objetos).

Um dos prefixos mais utilizados foi Tblou tbl, mas então eu tive TBLe tbl_e mesmo*TableName*_Tbl

insira a descrição da imagem aqui

Ao tentar consultar e trabalhar no Visual Studio, isso é apenas um inferno, eu não importaria ter todo um conjunto de tabelas com prefixo, tblmas por favor, mantenha-o assim para todo o Banco de Dados, pelo menos.

Então, no final, eu definitivamente diria que é uma questão de preferência pessoal, mas também tem muito a ver com consistência e, se você seguir esse caminho, muitas pessoas ficarão felizes, pelo menos você continuará igual ao longo do seu desenvolvimento.

... Por outro lado, eu só queria dizer, se você adotar outra abordagem e optar por uma tabela de nome singular sem prefixo, você fará um desenvolvedor feliz no futuro, e o que é mais importante do que a felicidade?

Nelz
fonte
11

Sim, adicionar um prefixo que denota o tipo do objeto é um problema e desnecessário . Porque,

  1. Às vezes, os objetos começam a vida como algo, mas acabam se tornando outra coisa . (por exemplo, a tabela tblXxxfoi dividida em tblXxxYe tblXxxZpor algum motivo e substituída por uma visão que une as duas novas tabelas. Agora você tem uma visão chamada tblXxx).
  2. Quando você digita tblno editor, o recurso AutoCompletar fica suspenso por 45 segundos e mostra uma lista de 4000 entradas.

Mas...

Eu vou bancar o advogado do diabo e dizer algo que outros já aconselharam. Existem alguns casos raros em que um sufixo / prefixo pode ser útil, e aqui está um exemplo da organização em que trabalho.

Temos um sistema ERP baseado em entidade, onde a lógica de negócios é escrita em Oracle PL / SQL. Tem quase duas décadas, mas ainda é um sistema muito estável (este não é um sistema legado. Estamos desenvolvendo-o continuamente).

O sistema é baseado em entidades e cada entidade associa uma tabela, várias visualizações, vários pacotes PL / SQL e uma série de outros objetos de banco de dados.

Agora, queremos que os objetos pertencentes à mesma entidade tenham o mesmo nome, mas que sejam distinguíveis de seu objetivo e tipo. Portanto, se tivermos duas entidades nomeadas CustomerOrdere CustomerInvoice, teremos os seguintes objetos:

  1. Tabelas para armazenar dados [ TABsufixo]:
    • CUSTOMER_ORDER_TAB
    • CUSTOMER_INVOICE_TAB.
  2. Exibições usadas pelos clientes [Sem sufixo]:
    • CUSTOMER_ORDER
    • CUSTOMER_INVOICE.
  3. Interface para operações básicas; (Pacotes PL / SQL) [ APIsufixo]:
    • CUSTOMER_ORDER_API
    • CUSTOMER_INVOICE_API.
  4. Geradores de relatórios; (Pacotes PL / SQL) [ RPIsufixo]:
    • CUSTOMER_ORDER_RPI
    • CUSTOMER_INVOICE_RPI.
  5. Índices para chaves primárias [ PKsufixo]:
    • CUSTOMER_ORDER_PK
    • CUSTOMER_INVOICE_PK.
  6. Índices secundários [ IXsufixo]:
    • CUSTOMER_ORDER_XXX_IX
    • CUSTOMER_INVOICE_XXX_IX(onde XXXdescreve o uso do índice).
  7. ... e assim por diante.

Essa é realmente uma forma de aplicativos húngaro (observe que o mesmo tipo de objetos pode ter sufixos diferentes, dependendo da finalidade). Mas, com um sufixo em vez de um prefixo. Não posso lhe dizer o suficiente como esse sistema é tão fácil de ler. O IntelliSense realmente funciona porque, em vez de digitar TBLe obter 4000 resultados, eu posso digitar Customere obter todos os objetos pertencentes às entidades nomeadas Customer*.

Então, aqui eu mostrei como os metadados podem ser úteis. O objetivo é ter um conjunto relacionado de objetos de banco de dados identificáveis ​​por um único nome, mas diferenciá-los com base em seus objetivos .

Dito isto, se você não possui esse tipo de sistema, não há uso de prefixar ou sufocar o tipo de objeto .

Note que não temos sufixos como usado _table, _packageou _view(ou seja, o tipo do objeto). Por exemplo, (3) e (4) são pacotes PL / SQL, mas usam um sufixo diferente. É o mesmo para (5) e (6), os quais são índices. Portanto, o sufixo é baseado no objetivo e não no tipo .

sampathsris
fonte
3
Estou implementando este produto ERP, e a convenção de nomenclatura é muito útil para reforçar o padrão "Consultar uma exibição, atualizar com uma API" e evita a tentação de atualizar uma tabela diretamente, sem considerar cuidadosamente a lógica de negócios.
grahamj42
10

tl; dr (muito provavelmente) adiciona informações redundantes, levando a sobrecarga cognitiva e, portanto, deve ser removido.

O contexto é uma coisa maravilhosa, especialmente em sistemas de computador. Fora do contexto, você não poderia dizer se algo chamado usersé uma tabela, uma exibição, um procedimento armazenado ou algo completamente diferente. Sistemas e linguagens legados (ou mal escritos) geralmente tornam difícil elaborar o contexto durante a leitura do código. Por exemplo, no Bash, você não pode dizer o que function usersfaz sem ao menos ler o conteúdo da função. Em Java, Map<Uid,UserDetails> users()é bastante transparente, e você pode se aprofundar nos detalhes facilmente.

Levando esse argumento para tabelas SQL, quando seria útil para os consumidores userssaber se é uma tabela ou uma exibição? Em outras palavras, um tblprefixo dirá a algum consumidor algo que ele não sabe e precisa saber?Esperamos que a grande maioria dos consumidores escreva consultas DML e DQL contra ele. Para eles, deve ser apenas outra fonte de dados, e se é uma exibição ou uma tabela deve ser tão relevante quanto se ela foi particionada, armazenada em HDD ou SSD ou qualquer outro detalhe técnico. É claro que o DBA precisa conhecer esses detalhes para executar algumas consultas raras de DDL / DCL, mas parece contraproducente poluir o espaço de nome em nome da minoria que realmente sabe como navegar no esquema e obter todos os detalhes técnicos.

l0b0
fonte
9

Um dos recursos de um sistema de gerenciamento de banco de dados relacional é que ele separa a apresentação lógica das informações para os clientes do armazenamento físico. O primeiro são colunas em um conjunto de linhas. O último é como arquivos em um volume de armazenamento. O trabalho do DBMS é mapear um para o outro. É uma preocupação apenas para o DBA ou sysadmin qual hardware suporta a necessidade de informações. O consumidor não precisa, de fato, não deve estar ciente dessas preocupações.

O cliente também não deve se preocupar com a forma como um conjunto de linhas é construído. Uma tabela base, uma visão ou uma função são todas, a esse respeito, idênticas. Cada um simplesmente produz um conjunto de linhas e colunas que o cliente consome. Mesmo um escalar simples pode ser considerado uma tabela de uma linha e uma coluna. O modelo de linha / coluna é o contrato entre o cliente e o servidor.

Ao prefixar os nomes dos artefatos com seu tipo de implementação, essa separação de preocupações é interrompida. O cliente agora está ciente e depende dos internos do servidor. Mudanças na codificação do servidor podem exigir retrabalho do cliente.

Michael Green
fonte
8

Há muitas respostas aqui que eu concordo que dizem que essa não é uma convenção de nomes muito valiosa. Para as pessoas que não estão convencidas pelas outras respostas, tentarei demonstrar o que muitas outras respostas estão dizendo.


SELECT
  bar
  , fizz
  , buzz
FROM dbo.foo

Na declaração acima, estou selecionando três colunas de algo chamado dbo.foo. Uma das principais reclamações dos prefixadores é que eles não sabem se dbo.fooé uma tabela ou uma exibição. Claro que esse é um dos pontos fortes de uma visão como uma abstração, mas discordo. Eles dizem que devemos prefixar o objeto assim dbo.tblFoo. Agora eles podem ver que o objeto é uma tabela (provavelmente) na consulta acima. No entanto, se escrevermos o equivalente funcional desse objetivo, ficaria assim.

SELECT
  bar
  , fizz
  , buzz
FROM dbo.Foo --table

Suspeito que o comentário pareça menos útil, embora seja para isso que os prefixadores estão argumentando efetivamente. Para destacar o ruído inútil que esse comentário de metadados injeta, considere uma consulta mais complicada.

SELECT
  qc.occurances
  , i.employeeId
  , q.questionText
FROM dbo.questionCount /*Indexed view*/ qc WITH (NOEXPAND)
  INNER JOIN dbo.interviewer /*partitioned view*/ i ON i.employeeId = qc.interviewerId
  INNER JOIN dbo.question /*table*/ q ON q.id = qc.questionId
WHERE
  EXISTS (
           SELECT 
             1 
           FROM dbo.currentEmployees /*view*/ ce 
             INNER JOIN dbo.questionsAsked /*table*/ qa ON qa.candidateId = ce.candidateId
           WHERE
             ce.employeeId = i.employeeId
             AND
             qa.questionId = q.id
         )
  AND
  qc.occurances > 5;

Os comentários extras tornam essa consulta mais fácil de ser discutida ou apenas adicionam ruído extra? Na minha opinião, eles acrescentam ruído extra e valor zero. É isso que os anti-prefixadores estão tentando dizer. Além disso, o uso de prefixos é realmente pior do que esses comentários, porque o custo da atualização de um comentário é muito menor do que a atualização do nome de uma tabela prefixada, se o modelo de dados precisar ser adaptado. Como esses prefixos têm um custo e não fornecem informações valiosas, eles devem ser evitados.

Outra vantagem dos prefixos que algumas pessoas citam é que ele pode transmitir algum tipo de agrupamento ou ordem em seu ambiente de desenvolvimento. Como gastamos muito tempo editando código, esse pode ser um argumento sedutor para alguns. No entanto, na minha experiência, os ambientes de desenvolvimento modernos oferecem opções equivalentes ou superiores que não sobrecarregam seu código com metadados inúteis e limitam sua flexibilidade.

Erik
fonte
7

Isso já foi abordado muitas vezes, mas provavelmente o mais famoso foi Joe Celko , especialista em SQL americano e banco de dados relacional. Eu, pessoalmente, recebi um de seus comentários on-line (me senti honrado), e ele fala desses prefixos como "brincadeiras", ou mais precisamente descritos como " skeuomorfismo ".

A idéia geral é que esses prefixos são uma prática de codificação de muito tempo atrás (provavelmente devido a limitações de nomes, como um limite de 8 bytes para nomes de objetos), transmitidos por gerações de programadores por nenhuma razão aparentemente útil, a não ser que seja apenas "o caminho" está feito".

Empresas, blogueiros e programadores transmitem informações com seu próprio estilo de codificação, e alguns estilos podem ser um pouco mais "Frankenstein" do que outros. Uma empresa pode ter um "estilo de casa" e o programador é forçado a aprender essa prática.

Com o tempo, as coisas permanecem, mesmo que o motivo pelo qual elas foram usadas originalmente seja descontinuado. "Tibbling" é um dos exemplos mais conhecidos disso no gerenciamento de banco de dados relacional.

Para resumir: ele não agrega nenhum valor, ele adiciona exatamente 4 bytes de espaço de armazenamento em cada nome de tabela por nenhuma outra razão senão porque está lá. Ele não oferece nada para os sistemas modernos do SQL Server, mas se você se sentir melhor com ele, vá em frente e use-o.

John Bell
fonte
8
Eu diminuí a votação desta resposta por causa da frase "mas se isso faz você se sentir melhor por tê-la lá, vá em frente e use-a". Esse é um motivo horrível para usar uma convenção.
Jpmc26 #
@ jpmc26 Concordo, no entanto, é um motivo, e ele é livre para usá-lo.
John Bell
6
@JohnBell, mas você é livre para não recomendo ...
dan1111
@ dan1111 De fato, e acho que pelo tom geral da minha resposta, qualquer pessoa com algum raciocínio lógico - que espero que deva usar qualquer linguagem de programação - possa deduzir que não é recomendável usar "tbl_" ou " _tbl ".
John Bell
5

Minha sugestão seria que você pare de fazer isso imediatamente. Se isso lhe deixar desconfortável no futuro, adicione "_tbl" ao final dos nomes de suas tabelas. Obviamente, pelas razões já mencionadas, também não há necessidade de fazer isso. A pessoa que originalmente lhe disse para fazer isso deu alguns conselhos ruins. Pode ter sido ruim "isso faz sentido em termos do sistema mal configurado de nossa organização", mas, nesse caso, era seu trabalho corrigi-lo. Ainda um conselho ruim.

user3131341
fonte
1
Não sei se 'você deve parar de fazer isso imediatamente, mas pode continuar fazendo isso em um local diferente' faz algum sentido.
Sublinhado_d
3

O "Não prefixe suas tabelas com tbl" é realmente um problema?

Em relação ao sistema? Não. Em relação às outras pessoas? Talvez. Você pode gerar muito ódio.

Pessoalmente, não prefixo tabelas, mas o faço em outros objetos, como visualizações, procedimentos armazenados, funções etc.

Joe
fonte
1

Eu teria que dizer por favor, pare de fazer isso. Isso já aconteceu no passado, mas, ao continuar fazendo isso, você incentiva novas pessoas que entram no seu ambiente a pensar que é uma convenção local e continuam. Mas eles não continuarão, farão de maneira um pouco diferente

Ao rastrear um banco de dados para um item específico, não sou o único que abrirá o explorador de objetos e pensará que vou rolar para ele, você sabe que é alfabético. Até que os prefixos começam a enlamear as águas, e eu tenho tblname, tbl_name, tbname, t_name e milhares de outras variações, fica muito difícil encontrar a tabela que você sabe que já é uma tabela

Da mesma forma, prefixando tudo vw_ ou sp_, alguém entrará e você receberá SPname, spname, s_p_name. Remova todos os prefixos, o software sabe qual é o item. Se você realmente precisar saber, use um sufixo. NameOfMyView_v, NameOfMyProc_sp. muito mais fácil procurar visualmente

Mas e se você estiver vasculhando um longo processo proc e não puder dizer com facilidade o que é um modo de exibição de um proc ou uma tabela? Bem, as chances são de que, de qualquer maneira, elas tenham um alias e mesmo que o sufixo não seja o seu auxílio

Não tenha medo de mudar o que faz, e se você entrar em um ambiente em que as convenções de nomenclatura já estão sendo disparadas, não tenha medo de implementar suas próprias e comece a mudar as coisas para melhor. Combinando o caos existente, não há chance de torná-lo menos confuso, apenas tornando-o ainda mais

barbudo
fonte
-3

Se eu tiver que pensar em uma vantagem de ter o prefixo 'tbl', é que no SSMS atual, com o intellisense, eu posso apenas digitar

select * from tbl

e encontre o nome da tabela necessário (supondo que eu não tenha idéia do nome exato da tabela). Este é um trabalho de uma etapa. Obviamente, sempre podemos descobrir o nome da tabela através de etapas adicionais, mas eu diria que, com o prefixo 'tbl', esse é o trabalho de uma etapa, e é por isso que eu sempre prefiro um prefixo (não necessariamente 'tbl') em meu próprio projeto de casa.

Edit : (Depois de tantos votos negativos, ainda acho que vale a pena apontar algumas vantagens de nicho ao atribuir um prefixo específico a uma categoria específica de objetos no servidor sql). Parece que ninguém reclama de ter um prefixo para procedimento / funções / visualizações armazenadas, mas sempre há argumentos sobre isso com tabelas. (Para mim, no mundo real, não posso me importar menos se damos ou não um prefixo às tabelas).

Lembro-me que no SQL Server 2005 dias, havia um requisito para descobrir quais tabelas são usadas em quais procedimentos / visualizações armazenados, com nomes de tabelas prefixados, era um trabalho tão fácil com Expressão Regular / C #. (Sim, eu sei que havia outras maneiras, nenhum argumento aqui).

Minha carreira cresce com a leitura de muitos papéis / artigos sobre "melhores práticas", mas também vi exceções suficientes para quase todas as "melhores práticas" de uma maneira ou de outra em diferentes cenários. Assim, eu sempre digo a mim e aos meus colegas DBAs, julgue de acordo com os requisitos de negócios, que "as melhores práticas" têm seu lugar com certeza, mas só podem ser consideradas no contexto de nosso próprio ambiente.

jyao
fonte
2
É muito fácil abrir o gerenciador de objetos no SSMS para ver todos os nomes de tabela negando essa "vantagem". Além disso, tenho certeza de que seu truque só funcionará corretamente ao fazer referência à tabela sem um esquema que possa levar a outros problemas. Não sei se essas ou outras razões influenciaram a decisão das pessoas de votar menos, mas elas parecem razões objetivas para votar menos na minha opinião.
Erik
Eu tenho que dizer que usar o prefixo "tbl" tem uma vantagem de nicho aos meus olhos. Sim, você pode digitar schema para acionar o intellisense, mas se no meu ambiente de teste, eu tenho apenas [dbo] como meu esquema? Na verdade, no meu próprio projeto, geralmente gosto de sublinhado "_" (mas é o mesmo que "tbl" em teoria). Tudo tem dois lados como moeda, assim como algumas pessoas preferem nomes longos de mesa, enquanto outras preferem abreviações. Essa questão de prefixo traz muitas discussões interessantes. Minha opinião é que, desde que seu argumento faça sentido, é um bom argumento.
jyao
6
Eu acredito que os votos negativos apenas mostram que esse argumento é comparativamente fraco. Se você precisar enfrentar o cenário descrito por @billinkc em sua resposta, terá uma exibição com o mesmo prefixo que as tabelas. Além do fato de que isso seria enganoso, como foi apontado, você também sempre terá essa visualização na lista de sugestões ao digitar o prefixo. Depois de ter muitas dessas visões, a vantagem da qual você está falando não será mais tão importante quanto a pintura.
Andriy M
-3

Considere dbo.Uservs dbo.tUser. Agora imagine que você deseja encontrar todos os lugares no código em que esta tabela é usada. Qual versão facilita isso (ou mesmo é possível?) É provável que a palavra "usuário" tenha muitos falsos positivos, como nomes de variáveis, nos comentários, etc.

Isso é algo que eu não vi em nenhuma das outras respostas, mas sou desenvolvedor-DBA-desenvolvedor, então talvez outros não tenham trabalhado no código legado, onde as consultas podem ser incorporadas no aplicativo e nem todas consultas qualificam totalmente as referências com o esquema e coisas assim. (Mesmo que tudo é totalmente qualificado, você precisa encontrar dbo.Usere [dbo].[User]e dbo.[User]e assim por diante). Ou versões de banco de dados em que as "informações de dependência" ficam obsoletas e são imprecisas (por exemplo, versões mais antigas do MS-SQL)

Assim, em alguns projetos em que trabalhei, que são misturados dessa maneira, ordenei um tou vprefixo (tbl_ fica bobo), simplesmente para torná-lo um termo de pesquisa mais seletivo.

Em projetos posteriores, com coisas como o SQL Server Data Tools (olá, Localizar todas as referências) e acesso ao banco de dados exclusivamente por meio de uma camada ORM, não há utilidade, pois encontrar todos os usos da tabela é trivial (como é renomeado!)

Mark Sowul
fonte
Vamos continuar esta discussão no chat .
MarkSowul #
-4

Cada lado tem suas vantagens e desvantagens. Cabe ao líder da sua equipe ou empresa decidir sobre as convenções a seguir.

Nós, por exemplo, usamos a tblconvenção. A principal razão é que sabemos nos scripts o que podemos e o que não devemos fazer. Temos projetos variados e pessoas que pulam sem saber o esquema de cor. Nossas tabelas têm nomes lógicos, portanto, é fácil encontrar seu caminho ao escrever scripts. Ao fazer isso, quando encontramos uma tabela, sabemos imediatamente (por meio do IntelliSense) que é uma tabela. Pode-se argumentar que adicionar o prefixo não adiciona muito contexto. No entanto, removê-lo significa que não há contexto.

A única vantagem real de não usar o prefixo é a permutabilidade. No entanto, eu argumentaria que esta é uma situação potencialmente perigosa. Claro, seus scripts e consultas não serão interrompidos, mas talvez você comece a confiar demais nesse fato, enquanto algumas coisas simplesmente não funcionam com visualizações ou são desaconselhadas.

No final, tudo se resume ao que sua equipe prefere e como ele escreve códigos / scripts.

Kevin V
fonte
Não entenda por que as pessoas não gostam de uma resposta honesta. Se sua equipe usa, use-o porque você só irritará seus colegas de trabalho, se não o fizerem, não. Desculpe, é fácil a resposta. Se você está trabalhando por conta própria, pesa apenas os contras e os profissionais. Não ouça as massas apenas porque são as massas.
Kevin V
-12

Eu costumava ter um motivo para prefixar os nomes das tabelas com "tbl". Se você estiver visualizando uma lista de objetos de banco de dados, poderá executar esta consulta:

select * from sysobjects

Se você deseja obter apenas tabelas, pode fazer o seguinte:

select * from sysobjects where type = 'U'

Quem se lembra disso? Se todos os nomes de tabela começarem com "tbl", você poderá usar esta consulta que não exige que você memorize os valores da coluna type:

select * from sysobjects where name like 'tbl%'

Desde que você marcou o SQL Server 2014, isso não se aplica a você porque, a partir do SQL Server 2005, você pode fazer isso:

select * from sys.tables

Não consigo pensar em outro motivo para prefixar nomes de tabelas.

user2023861
fonte
12
1) Re: " Quem pode se lembrar disso? " Memorizar where type = 'U'não é muito diferente where name like 'tbl%', principalmente depois de fazer algumas vezes. 2) No interesse de obter informações precisas, sys.tablesestava disponível a partir do SQL Server 2005: technet.microsoft.com/sr-latn-rs/library/ms187406(v=sql.90) technet.microsoft.com/sr-latn- rs / biblioteca / ms187406 (v = sql.90)
Solomon Rutzky
8
Você pode não lembrar 'U', mas você sempre pode criar um ponto de vista: create view all_the_tables as select * from sysobjects where type = 'U';Em seguida, basta executarselect * from all_the_tables;
ypercubeᵀᴹ