O alias de tabela é uma prática ruim?

21

Lembro-me de aprender a fazer isso em um curso DBMS para alunos do Master of Information Services. Para economizar digitação, você pode digitar:

SELECT t1.id, t2.stuff 
FROM 
              someTable    t1 
   INNER JOIN otherTable   t2 
      ON t1.id=t2.id
;

Mas ... Por que isso é aceitável em procedimentos armazenados e tal? Parece que tudo o que faz é prejudicar a legibilidade da declaração, economizando uma quantidade extremamente pequena de tempo. Existe alguma razão funcional ou lógica para fazer isso? Parece adicionar ambiguidade ao invés de removê-lo; o único motivo aceitável que posso ver para usar esse formato é se você estava adicionando um alias semanticamente significativo - por exemplo, FROM someTable idsTable- quando o nome da tabela não é suficientemente descritivo.

O alias de tabela é uma prática ruim ou isso é apenas um mau uso de um sistema útil?

Ben Brocka
fonte
8
Ao escrever alguns milhares de linhas de SQL, você apreciará a digitação salva. Este é um caso em que, usado com cuidado, você pode comprar maior produtividade por pouco ou nenhum custo em manutenção.
Jon de Todos os Negócios
6
Quase todas as consultas que escrevi que começaram com uma tabela acabaram se expandindo para abranger mais tabelas ("Isso é ótimo, mas você pode adicionar Foo?"). Aliasing cada coluna na frente irá simplificar sua vida.
billinkc
A única coisa boa que posso ver sobre essa prática muito comum de criar alias em todas as tabelas em todas as consultas é que, às vezes, um desenvolvedor criativo consegue inserir uma palavra maliciosa no código!
NeedHack
Por que não apenas select id, stuff from someTable natural join otherTable?
Colin 'Hart Hart

Respostas:

39

O alias de tabela é uma prática comum e útil.

  • Ele salva as teclas pressionadas ao fazer referência a colunas em qualquer lugar da sua consulta.
  • Isso melhora a legibilidade do seu SQL quando você está referenciando muitas tabelas. Os aliases permitem que você dê um nome abreviado a essas tabelas e um pouco de significado de como elas estão sendo usadas.
  • É até necessário quando você une uma tabela a si mesma ou quando ingressa na mesma tabela várias vezes. Isso significa que o otimizador de consulta sabe qual tabela você está fazendo referência quando menciona uma coluna.

O seguinte extrato de relatório ilustra bem todos os pontos acima:

INSERT INTO reporting.txns_extract
SELECT 
    -- 30+ columns snipped
    -- 
    -- Would you want to type out full table names for each 
    -- column here?
FROM 
    -- ... and in the JOIN conditions here?
                billing.financial_transactions  ft_cdi   -- alias required here
    INNER JOIN  
                billing.cash_application_links  cal
            ON  ft_cdi.key_num = cal.applied_ft_key_num
    INNER JOIN  
                billing.financial_transactions  ft_pmt   -- alias required here
            ON  cal.owner_key_num = ft_pmt.key_num
    LEFT OUTER JOIN
                billing.invoice_lines           invl
            ON  ft_cdi.key_num = invl.invoice_key_num
    LEFT OUTER JOIN
                billing.charges                 chrg
            ON  invl.creator_key_num = chrg.key_num
    LEFT OUTER JOIN
                billing.customer_services       cs
            ON  chrg.cs_key_num = cs.key_num
    INNER JOIN
                billing.billers                 bil
            ON  ft_cdi.biller_account_key_num = bil.biller_account_key_num
    INNER JOIN
                billing.formal_entities         fe
            ON  bil.frml_key_num = fe.key_num
WHERE
    -- ... and in the WHERE conditions here?
        ft_cdi.transaction_type <> 'Payment'   -- alias tells me this table is not for payments
    AND ft_cdi.status = 'Approved'
    AND ft_pmt.transaction_type =  'Payment'   -- alias tells me this table is for payments
    AND ft_pmt.status = 'Approved'
    AND ft_cdi.last_user_date >   ft_last_user_date_begin
    AND ft_cdi.last_user_date <=  ft_last_user_date_end
;
Nick Chammas
fonte
2
Os aliases são mais legíveis para as pessoas que escreveram e leram muito SQL. Eles são menos legíveis para os novos desenvolvedores de banco de dados, mas acho que é um obstáculo que eles precisam resolver mais cedo ou mais tarde.
Mike Sherrill 'Cat Recall'
7
Eu recomendo vivamente aliases significativos. É realmente bom ver um exemplo com pseudônimos significativos em vez de t1, t2 ... ou a, b, b, c, d, e .... Pode ficar realmente confuso quando você obtém pseudônimos como funcionários a, endereços b , contas c, cobrança d, clientes e.
BillThor
4
Eu acho que também é importante usar o alias em todas as referências de coluna para facilitar a manutenção também. Claro que apenas uma tabela tem o campo chamado xyzjunk, mas qual? Quando você escreve consultas complexas de relatórios, é útil saber sempre onde seus campos foram formados.
HLGEM
1
Também é necessário quando você ingressa em uma tabela derivada também.
HLGEM
@HLGEM - Ambos os pontos excelentes.
31412 Nick Chammas
12

Eu acho que o uso de aliases ajuda a legibilidade de uma consulta se os nomes das tabelas forem longos ou muito parecidos entre si, para que alguém que os leia rapidamente os confunda. Você acha que isso ...

SELECT Really_long_table_name.ID,
       Even_longer_table_name_than_before.Name,
       Even_longer_table_name_than_before.Description,
       Even_longer_table_name_than_before.State
FROM   Really_long_table_name
       INNER JOIN Even_longer_table_name_than_before
               ON Really_long_table_name.ID = Even_longer_table_name_than_before.ID
WHERE  Really_long_table_name.Department = 'Whatever' 

é mais legível que isso?

SELECT a.ID,
       b.Name,
       b.Description,
       b.State
FROM   Really_long_table_name a
       INNER JOIN Even_longer_table_name_than_before b
               ON a.ID = b.ID
WHERE  a.Department = 'Whatever' 

Dependendo do que você usa como alias de tabela, pode tornar a consulta muito mais simples para uma pessoa ler e entender.

Jason
fonte
2
Eu sempre quero caçar e matar desenvolvedores que não aliasem suas tabelas (bem, não literalmente). Esse primeiro exemplo faz meus olhos sangrarem. E de alguma forma, quando eles fazem isso, eles não criam seu código, para que eu possa visualizá-lo sem rolar também (como você fez).
HLGEM
5

O alias de tabela (em nome de nomes mais curtos) não é uma prática ruim.

Normalmente, eu o uso quando os nomes de tabela são longos e, em seguida, só uso o alias que faz sentido:

SELECT tTable.stuff FROM track_table tTable;

Se você deseja melhorar a legibilidade, pode usar a ASpalavra-chave:

SELECT tTable.stuff FROM track_table AS tTable;

Mas, como você se acostuma à sintaxe, ela não é necessária.

Derek Downey
fonte
0

Você pode usar isso para aumentar significativamente a legibilidade de suas consultas. Em vez de usar um alias curto, use seu alias para descrever os dados aos quais você está ingressando, por exemplo

SELECT
    transaction.unique_id,
    authorisingUser.name AS authorising_user_name,
    requestingUser.name AS requesting_user_name
FROM transactions AS transaction
JOIN users AS authorisingUser
    ON authorisingUser.user_id = txn.authorising_user_id
JOIN users AS requestingUser
    ON requestingUser.user_id = txn.request_user_id

Embora o uso de aliases extremamente curtos (como aou t1) possa dificultar a leitura de uma consulta, você precisa encontrar o alias para pesquisar o que o alias significa, mas um alias bem nomeado pode tornar a consulta mais legível do que apenas usar a tabela nomes.

Justin
fonte
-1

Esta é uma pergunta sobre "más práticas". As respostas parecem ser sobre "Salvando pressionamentos de tecla".

Pessoalmente, minha velocidade de codificação é limitada pela minha velocidade de pensamento, não pela minha velocidade de digitação. Acho o código com muitos aliases de tabela muito mais difíceis de ler do que o código que usa os nomes das tabelas. Os aliases da tabela adicionam outro nível de indireção.

No entanto, a maioria dos programadores usa aliases de tabela (embora eu não o faça). Alguns "ambientes de desenvolvimento SQL" tornam isso muito fácil, e alguns professores ensinam aliases de tabela automaticamente, especialmente como parte do aprendizado da sintaxe "Participar".

Usar aliases de tabela não é uma prática ruim, mas às vezes tenho que passar pelo código e substituí-lo pelos nomes originais da tabela para entender o que está acontecendo.

DWalker07
fonte