Apakah tabel alias praktik yang buruk?

21

Saya ingat belajar melakukan ini dalam kursus DBMS untuk siswa Magister Layanan Informasi. Untuk menghemat beberapa pengetikan, Anda dapat mengetik:

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

Tapi ... Mengapa ini bisa diterima dalam prosedur tersimpan dan semacamnya? Sepertinya yang dilakukannya hanyalah merusak keterbacaan pernyataan sambil menghemat waktu yang sangat kecil. Apakah ada alasan fungsional atau logis untuk melakukan ini? Tampaknya menambah ambiguitas daripada menghapusnya; satu-satunya alasan yang dapat saya lihat untuk menggunakan format ini adalah jika Anda menambahkan alias bermakna semantik - misalnya, FROM someTable idsTable- ketika nama tabel tidak cukup deskriptif.

Apakah tabel alias praktik yang buruk atau ini hanya penyalahgunaan sistem yang membantu?

Ben Brocka
sumber
8
Ketika Anda telah menulis beberapa ribu baris SQL, Anda akan menghargai pengetikan yang disimpan. Ini adalah kasus di mana, digunakan dengan hati-hati, Anda dapat membeli peningkatan produktivitas dengan sedikit atau tanpa biaya pemeliharaan.
Jon of All Trades
6
Hampir setiap permintaan yang saya tulis yang dimulai dengan satu tabel akhirnya tumbuh untuk mencakup lebih banyak tabel ("Ini bagus, tetapi bisakah Anda menambahkan Foo?"). Mengasingkan setiap kolom di depan akan menyederhanakan hidup Anda.
billinkc
Satu-satunya hal yang baik yang dapat saya lihat tentang praktik yang sangat umum ini adalah peng aliasing semua tabel di semua kueri adalah bahwa terkadang pengembang kreatif berhasil memasukkan kata nakal ke dalam kode!
NeedHack
Kenapa tidak adil select id, stuff from someTable natural join otherTable?
Colin 't Hart

Jawaban:

39

Aliasing tabel adalah praktik umum dan bermanfaat.

  • Ini menghemat penekanan tombol saat mereferensikan kolom di mana saja dalam kueri Anda.
  • Ini meningkatkan keterbacaan SQL Anda ketika Anda mereferensikan banyak tabel. Alias ​​memungkinkan Anda memberi nama pendek pada tabel-tabel itu ditambah sedikit makna tentang bagaimana tabel-tabel itu digunakan.
  • Bahkan diperlukan ketika Anda bergabung dengan tabel itu sendiri atau ketika Anda bergabung ke meja yang sama beberapa kali. Ini agar pengoptimal kueri tahu tabel mana yang Anda referensikan saat Anda menyebutkan kolom.

Ekstrak pelaporan berikut menggambarkan semua poin di atas dengan baik:

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
sumber
2
Alias ​​lebih mudah dibaca untuk orang yang telah menulis dan membaca banyak SQL. Mereka kurang mudah dibaca untuk pengembang database baru, tapi saya pikir itu adalah rintangan yang harus mereka hapus cepat atau lambat.
Mike Sherrill 'Cat Recall'
7
Saya sungguh-sungguh merekomendasikan alias bermakna. Sangat menyenangkan untuk melihat contoh dengan alias bermakna daripada t1, t2 ... atau a, b, b, c, d, e .... Itu bisa sangat membingungkan ketika Anda mendapatkan alias seperti karyawan a, alamat b , akun c, penagihan d, pelanggan e.
BillThor
4
Saya pikir penting juga untuk menggunakan alias pada setiap kolom referensi agar lebih mudah dirawat. Tentu saja satu tabel memiliki bidang bernama xyzjunk, tetapi yang mana? Saat Anda menulis kueri pelaporan yang rumit, akan sangat membantu untuk selalu mengetahui dari mana bidang Anda berasal.
HLGEM
1
Ini juga diperlukan saat Anda bergabung ke tabel turunan juga.
HLGEM
@HLGEM - Keduanya poin bagus.
Nick Chammas
12

Saya pikir menggunakan alias membantu keterbacaan kueri jika nama tabel panjang atau mirip satu sama lain sehingga seseorang yang membacanya dengan cepat mungkin keliru. Apakah Anda pikir ini ...

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' 

lebih mudah dibaca dari ini?

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' 

Bergantung pada apa yang Anda gunakan sebagai alias tabel, ini dapat membuat kueri lebih sederhana bagi seseorang untuk dibaca dan dipahami.

Jason
sumber
2
Saya selalu ingin memburu dan membunuh pengembang yang tidak alias meja mereka (baik tidak secara harfiah). Contoh pertama itu membuat mata saya berdarah. Dan entah bagaimana ketika mereka melakukan ini mereka tidak membuat kode mereka sehingga saya dapat melihatnya tanpa menggulir juga (seperti yang Anda lakukan).
HLGEM
5

Aliasing tabel (demi nama tabel pendek) bukan praktik yang buruk.

Saya biasanya menggunakannya ketika nama tab panjang dan kemudian hanya menggunakan alias yang masuk akal:

SELECT tTable.stuff FROM track_table tTable;

Jika Anda ingin meningkatkan keterbacaan, Anda dapat menggunakan ASkata kunci:

SELECT tTable.stuff FROM track_table AS tTable;

Tetapi, ketika Anda terbiasa dengan sintaks, itu tidak diperlukan.

Derek Downey
sumber
0

Anda dapat menggunakan ini untuk secara signifikan meningkatkan keterbacaan kueri Anda. Alih-alih menggunakan alias pendek, gunakan alias Anda untuk menggambarkan data yang Anda gabungkan, misalnya

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

Meskipun menggunakan alias yang sangat singkat (seperti aatau t1) dapat membuat kueri sulit dibaca karena Anda harus pergi dan menemukan alias untuk mencari apa artinya alias, alias yang bernama baik seringkali dapat membuat kueri lebih mudah dibaca daripada hanya menggunakan tabel nama.

Justin
sumber
-1

Ini adalah pertanyaan tentang "praktik buruk". Jawabannya tampaknya tentang "Menyimpan penekanan tombol".

Secara pribadi, kecepatan pengkodean saya dibatasi oleh kecepatan pikiran saya, bukan oleh kecepatan mengetik saya. Saya menemukan kode dengan banyak alias tabel yang jauh lebih sulit dibaca daripada kode yang menggunakan nama tabel itu sendiri. Alias ​​tabel menambahkan tingkat tipuan lainnya.

Namun, sebagian besar programmer menggunakan alias tabel (walaupun saya tidak). Beberapa "lingkungan pengembangan SQL" membuat ini sangat mudah dilakukan, dan beberapa guru mengajarkan alias tabel secara otomatis, terutama sebagai bagian dari pembelajaran sintaksis "Bergabung".

Menggunakan alias tabel bukanlah praktik yang buruk, tetapi kadang-kadang saya harus melalui kode dan mengganti alias dengan nama tabel asli untuk memahami apa yang terjadi.

DWalker07
sumber