Tablo takma işlemi kötü bir uygulama mıdır?


21

Bunu, DBMS kursunda Bilgi Hizmetleri Yüksek Lisans öğrencileri için yapmayı öğrendiğimi hatırlıyorum. Kendinize biraz yazı yazmak için şunu yazabilirsiniz:

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

Ama ... Neden saklı yordamlarda böyle kabul edilebilir? Yaptığı her şey ifadenin okunabilirliğine zarar verirken son derece küçük bir zaman tasarrufu sağlar. Bunu yapmak için herhangi bir işlevsel veya mantıklı sebep var mı? Kaldırmak yerine belirsizlik katıyor gibi görünüyor; Bu formatı kullanmak için görebildiğim tek kabul edilebilir sebep, anlamsal olarak anlamlı bir takma ad ekliyor olmanızdır (örneğin, FROM someTable idsTabletablo adı yeterince açıklayıcı değilse).

Masa takma adı kötü bir uygulama mı, yoksa bu yardımcı bir sistemin yanlış kullanımı mı?


8
Birkaç bin satır SQL yazdığınızda, kaydedilen yazıyı beğenirsiniz. Bu, özenle kullanıldığında, bakım maliyetini çok az veya ücretsiz olarak arttırılmış verimlilik satın alabileceğiniz bir durumdur.
Tüm İşlemlerin

6
Bir tabloyla başlayan yazdığım çoğu sorgu sonunda daha fazla tabloyu kapsayacak şekilde büyüdü ("Bu harika, ancak Foo ekleyebilir misiniz?"). Her sütunu öne takma, hayatınızı kolaylaştıracaktır.
billinkc

Tüm sorgularda tüm tabloları takma işlemine ilişkin bu yaygın uygulama hakkında görebildiğim tek iyi şey, bazen yaratıcı bir geliştiricinin, yaramaz bir kelimeyi koda geçirmeyi başardığı!
NeedHack

Neden sadece değil select id, stuff from someTable natural join otherTable?
Colin 'te Hart

Yanıtlar:


39

Tablo takma, yaygın ve yardımcı bir uygulamadır.

  • Sorgunuzda herhangi bir yere sütunlara başvururken size tuş vuruşlarını kaydeder .
  • Birçok tabloya başvururken SQL'inizin okunabilirliğini artırır . Takma adlar, bu tablolara kısa bir ad ve bunların nasıl kullanıldığı konusunda küçük bir anlam vermenizi sağlar.
  • Bir masaya kendinize katıldığınızda veya aynı masaya birden çok kez katıldığınızda bile bu gereklidir. Bu yüzden sorgu en iyi duruma getiricisi, bir sütundan bahsettiğinizde hangi tabloya başvurduğunuzu bilir.

Aşağıdaki raporlama özeti yukarıdaki tüm noktaları güzel bir şekilde göstermektedir:

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
;

2
Diğer adlar çok fazla SQL yazan ve okuyan insanlar için daha okunur. Yeni veritabanı geliştiricileri için daha az okunabilirler, ancak er ya da geç temizlemeleri gereken bir engel olduğunu düşünüyorum.
Mike Sherrill 'Cat Recall'

7
Yürekten anlamlı takma adları öneririm. T1, t2 ... veya a, b, b, c, d, e yerine anlamlı takma adları olan bir örneği görmek gerçekten çok güzel. Çalışanlar gibi takma adlar aldığınızda kafa karıştırıcı olabilir. , hesaplar c, fatura d, müşteriler e.
BillThor

4
Bence daha kolay bakım için her iki sütunda bulunan takma adı kullanmanın da önemli olduğunu düşünüyorum. Tabi ki bir tablonun xyzjunk adlı alanı var, ama hangisi? Karmaşık raporlama sorguları yazdığınızda, alanlarınızın nerede oluştuğunu her zaman bilmek yararlı olacaktır.
HLGEM

1
Ayrıca türetilmiş bir tabloya katıldığınızda da gereklidir.
HLGEM

@HLGEM - Her iki mükemmel nokta.
Nick Chammas

12

Bence takma ad kullanmak bir tablonun okunabilirliğini, eğer tablo isimleri birbirine çok uzun ya da çok benziyorsa, hızlı bir şekilde okuyan birisinin bunları yanlış anlamasını sağlar. Sence bu ...

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' 

bundan daha okunabilir mi?

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' 

Tablo takma adları olarak ne kullandığınıza bağlı olarak, bir kişinin okuması ve anlaması için sorguyu çok daha basit hale getirebilir.


2
Her zaman masalarını örtbas etmeyen geliştiricileri avlamak ve öldürmek istiyorum (kelimenin tam anlamıyla değil). Bu ilk örnek gözlerim kanıyor. Ve bir şekilde bunu yaptıklarında, kodlarını yapmazlar, böylece ben de (kaydırma yaptım)
HLGEM

5

Tablo diğer adı (kısa tablo adları için) kötü bir uygulama değildir.

Normalde tablenames uzun olduğunda kullanıyorum ve sonra sadece mantıklı olan takma adı kullanıyorum:

SELECT tTable.stuff FROM track_table tTable;

Okunabilirliği artırmak istiyorsanız, ASanahtar kelimeyi kullanabilirsiniz :

SELECT tTable.stuff FROM track_table AS tTable;

Ancak, sözdizimine alışınca, buna gerek yoktur.


0

Bunu, sorularınızın okunabilirliğini önemli ölçüde artırmak için kullanabilirsiniz. Kısa takma ad kullanmak yerine, takma adınızı, örneğin katıldığınız verileri tanımlamak için kullanın.

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

Aşırı kısa takma adlar kullanmak ( aveya veya gibi t1), gitmeniz ve takma adın ne anlama geldiğine bakmak için takma adı bulmanız gerektiğinde okunması zor bir sorguyu gerçekleştirirken, iyi adlandırılmış bir takma ad, sorguyu yalnızca tabloyu kullanmaktan daha okunaklı hale getirebilir isimler.


-1

Bu "kötü uygulama" ile ilgili bir sorudur. Cevaplar "Tuş vuruşlarını kaydetme" ile ilgili gibi görünüyor.

Şahsen, kodlama hızım yazma hızımla değil düşünce hızımla sınırlıdır. Çok sayıda tablo takma adı içeren kodu, tablo adlarını kullanan kodlardan çok okumayı daha zor buluyorum. Tablo takma adları başka bir yönlendirme düzeyi ekler.

Ancak, çoğu programcı tablo takma adları kullanır (ben olmasam da). Bazı "SQL geliştirme ortamları" bunu çok kolaylaştırır ve bazı öğretmenler özellikle "Katıl" sözdizimini öğrenmenin bir parçası olarak otomatik olarak tablo takma adlarını öğretir.

Tablo takma adlarını kullanmak kötü bir uygulama değildir, ancak bazen neler olduğunu anlamak için koddan geçip takma adımı orijinal tablo adlarıyla değiştirmem gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.