Ist Table Aliasing eine schlechte Praxis?

21

Ich erinnere mich, wie ich dies in einem DBMS-Kurs für Master of Information Services-Studenten gelernt habe. Um sich das Tippen zu ersparen, können Sie Folgendes eingeben:

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

Aber ... Warum ist dies in gespeicherten Prozeduren und dergleichen akzeptabel? Es scheint, als würde nur die Lesbarkeit der Aussage beeinträchtigt und dabei nur äußerst wenig Zeit gespart. Gibt es einen funktionalen oder logischen Grund dafür? Es scheint Mehrdeutigkeiten hinzuzufügen, anstatt sie zu beseitigen. Der einzige akzeptable Grund für die Verwendung dieses Formats ist, dass Sie einen semantisch aussagekräftigen Alias ​​hinzugefügt haben, zum Beispiel, FROM someTable idsTablewenn der Tabellenname nicht aussagekräftig genug ist.

Ist das Aliasing von Tabellen eine schlechte Praxis oder ist dies nur ein Missbrauch eines hilfreichen Systems?

Ben Brocka
quelle
8
Wenn Sie einige tausend Zeilen SQL geschrieben haben, werden Sie die gespeicherte Eingabe zu schätzen wissen. Dies ist ein Fall, in dem Sie bei sorgfältiger Verwendung eine höhere Produktivität bei geringen oder keinen Kosten für die Wartbarkeit erzielen können.
Jon of All Trades
6
Fast jede Abfrage, die ich geschrieben habe und die mit einer Tabelle begann, umfasste irgendwann mehr Tabellen ("Das ist großartig, aber können Sie Foo hinzufügen?"). Das Aliasing jeder Spalte im Voraus vereinfacht Ihr Leben.
Billinkc
Das einzig Gute an dieser sehr verbreiteten Praxis, alle Tabellen in allen Abfragen als Alias ​​zu verwenden, ist, dass es einem kreativen Entwickler manchmal gelingt, ein böses Wort in den Code einzufügen!
NeedHack
Warum nicht einfach select id, stuff from someTable natural join otherTable?
Colin 't Hart

Antworten:

39

Tabellen-Aliasing ist eine gängige und hilfreiche Methode.

  • Sie sparen Tastenanschläge, wenn Sie auf Spalten in Ihrer Abfrage verweisen.
  • Es verbessert die Lesbarkeit Ihres SQL, wenn Sie auf viele Tabellen verweisen. Mit Aliases können Sie diesen Tabellen einen kurzen Namen und eine kleine Bedeutung für ihre Verwendung geben.
  • Dies ist sogar erforderlich, wenn Sie eine Tabelle selbst oder mehrere Male derselben Tabelle beitreten. Auf diese Weise weiß der Abfrageoptimierer, auf welche Tabelle Sie verweisen, wenn Sie eine Spalte erwähnen.

Der folgende Berichtsextrakt veranschaulicht alle oben genannten Punkte:

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
quelle
2
Aliase sind besser lesbar für Benutzer, die viel SQL geschrieben und gelesen haben. Sie sind für neue Datenbankentwickler weniger lesbar, aber ich denke, es ist eine Hürde, die sie früher oder später sowieso beseitigen müssen.
Mike Sherrill 'Cat Recall'
7
Ich empfehle von Herzen sinnvolle Aliase. Es ist wirklich schön, ein Beispiel mit aussagekräftigen Aliasen anstelle von t1, t2 ... oder a, b, b, c, d, e ... zu sehen , Konten c, Abrechnung d, Kunden e.
BillThor
4
Ich denke, es ist auch wichtig, den Alias ​​für jede Spaltenreferenz zu verwenden, um die Wartung zu vereinfachen. Sicher, nur eine Tabelle hat das Feld xyzjunk, aber welche? Wenn Sie komplexe Berichtsabfragen schreiben, ist es hilfreich zu wissen, woher Ihre Felder stammen.
HLGEM
1
Dies ist auch erforderlich, wenn Sie eine Verknüpfung zu einer abgeleiteten Tabelle herstellen.
HLGEM
@HLGEM - Beide exzellenten Punkte.
Nick Chammas
12

Ich denke, die Verwendung von Aliasen hilft bei der Lesbarkeit einer Abfrage, wenn die Tabellennamen lang oder so ähnlich sind, dass jemand, der sie schnell liest, sie möglicherweise falsch interpretiert. Denken Sie, dass dies ...

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' 

ist lesbarer als das?

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' 

Abhängig davon, was Sie als Tabellen-Aliase verwenden, kann dies die Abfrage für eine Person einfacher lesbar und verständlich machen.

Jason
quelle
2
Ich möchte immer Entwickler jagen und töten, die ihre Tabellen nicht aliasen (also nicht wörtlich). Dieses erste Beispiel lässt meine Augen bluten. Und wenn sie das tun, machen sie irgendwie keinen Code, damit ich ihn sehen kann, ohne zu scrollen (so wie du es getan hast).
HLGEM
5

Tabellen-Aliasing (wegen kürzerer Tabellennamen) ist keine schlechte Praxis.

Ich benutze es normalerweise, wenn die Tabellennamen lang sind und benutze dann nur den Alias, der Sinn macht:

SELECT tTable.stuff FROM track_table tTable;

Wenn Sie die Lesbarkeit verbessern möchten, können Sie das ASSchlüsselwort verwenden:

SELECT tTable.stuff FROM track_table AS tTable;

Wenn Sie sich an die Syntax gewöhnt haben, ist sie jedoch nicht erforderlich.

Derek Downey
quelle
0

Sie können dies verwenden, um die Lesbarkeit Ihrer Abfragen erheblich zu verbessern. Verwenden Sie Ihren Alias ​​nicht als kurzen Alias, sondern als Beschreibung der Daten, mit denen Sie sich verbinden

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

Während die Verwendung von extrem kurzen Aliasnamen (wie aoder t1) die Lesbarkeit einer Abfrage erschwert, wenn Sie nach dem Alias ​​suchen müssen, um die Bedeutung des Alias ​​zu ermitteln, kann ein gut benannter Alias ​​häufig die Lesbarkeit einer Abfrage verbessern, als wenn Sie nur die Tabelle verwenden Namen.

Justin
quelle
-1

Dies ist eine Frage zu "schlechter Praxis". Die Antworten scheinen zu lauten "Tastatureingaben speichern".

Persönlich ist meine Codierungsgeschwindigkeit durch meine Gedankengeschwindigkeit und nicht durch meine Tippgeschwindigkeit begrenzt. Ich finde Code mit vielen Tabellenaliasen viel schwieriger zu lesen als Code, der die Tabellennamen selbst verwendet. Tabellenaliase fügen eine weitere Indirektionsebene hinzu.

Die meisten Programmierer verwenden jedoch Tabellenaliase (obwohl ich das nicht tue). Einige "SQL-Entwicklungsumgebungen" machen dies sehr einfach, und einige Lehrer unterrichten Tabellenaliase automatisch, insbesondere im Rahmen des Erlernens der "Join" -Syntax.

Die Verwendung von Tabellenaliasen ist keine schlechte Praxis, aber manchmal muss ich den Code durchgehen und die Aliase durch die ursprünglichen Tabellennamen ersetzen, um zu verstehen, was vor sich geht.

DWalker07
quelle