क्या टेबल एक बुरा अभ्यास है?


21

मुझे याद है कि मास्टर ऑफ इंफॉर्मेशन सर्विसेज के छात्रों के लिए डीबीएमएस कोर्स में ऐसा करना सीखना चाहिए। अपने आप को टाइपिंग से बचाने के लिए, आप टाइप कर सकते हैं:

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

लेकिन ... यह संग्रहीत प्रक्रियाओं और ऐसे में क्यों स्वीकार्य है? ऐसा लगता है कि यह सब करता है समय की एक मामूली राशि की बचत करते हुए बयान की पठनीयता को नुकसान पहुंचाता है। क्या ऐसा करने का कोई कार्यात्मक या तार्किक कारण है? इसे हटाने के बजाय अस्पष्टता जोड़ना प्रतीत होता है; इस प्रारूप का उपयोग करने के लिए मैं केवल स्वीकार्य कारण देख सकता हूं, यदि आप एक अर्थपूर्ण रूप से सार्थक उपनाम जोड़ रहे हैं - उदाहरण के लिए, FROM someTable idsTable- जब तालिका का नाम वर्णनात्मक नहीं है।

क्या टेबल एक खराब प्रथा है और यह सिर्फ एक सहायक प्रणाली का दुरुपयोग है?


8
जब आपने SQL की कुछ हज़ार लाइनें लिखी हैं, तो आप सहेजे गए टाइपिंग की सराहना करेंगे। यह एक ऐसा मामला है, जहां देखभाल के साथ उपयोग किया जाता है, आप कम उत्पादकता के लिए बढ़ी हुई उत्पादकता खरीद सकते हैं या रखरखाव में कोई लागत नहीं है।
जॉन ऑफ ऑल ट्रेड्स

6
मेरे द्वारा लिखी गई प्रत्येक क्वेरी में एक तालिका के साथ शुरू हुआ अंत में अधिक तालिकाओं को शामिल करने के लिए बढ़ी ("यह बहुत अच्छा है, लेकिन क्या आप फू जोड़ सकते हैं?")। हर कॉलम को सामने रखने से आपका जीवन सरल हो जाएगा।
बिलकिन्क सिप 21'11

सभी प्रश्नों में सभी तालिकाओं को अलियास करने की इस बहुत ही सामान्य प्रथा के बारे में मैं केवल एक ही अच्छी बात देख सकता हूं कि कभी-कभी एक रचनात्मक डेवलपर कोड में एक शरारती शब्द फिसल जाता है!
नीड हेक

सिर्फ क्यों नहीं select id, stuff from someTable natural join otherTable?
कॉलिन 'टी हार्ट

जवाबों:


39

टेबल अलियासिंग एक आम और सहायक अभ्यास है।

  • यह आपकी क्वेरी में कहीं भी कॉलम संदर्भित करते समय आपको कीस्ट्रोक्स बचाता है
  • जब आप कई तालिकाओं का संदर्भ दे रहे होते हैं तो यह आपके SQL की पठनीयता में सुधार करता है । उपनाम आपको उन तालिकाओं को एक छोटा नाम और प्लस का एक छोटा अर्थ देता है कि उनका उपयोग कैसे किया जा रहा है।
  • यह तब भी आवश्यक है जब आप किसी तालिका में स्वयं शामिल हों या जब आप एक ही तालिका में कई बार सम्मिलित हों। यह ऐसा है जब क्वेरी ऑप्टिमाइज़र जानता है कि आप किस तालिका का उल्लेख कर रहे हैं जब आप एक कॉलम का उल्लेख कर रहे हैं।

निम्नलिखित रिपोर्टिंग अर्क उपरोक्त सभी बिंदुओं को अच्छी तरह दिखाता है:

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
उपनाम उन लोगों के लिए अधिक पठनीय हैं जिन्होंने बहुत अधिक एसक्यूएल लिखा और पढ़ा है। वे नए डेटाबेस डेवलपर्स के लिए कम पठनीय हैं, लेकिन मुझे लगता है कि यह एक बाधा है जो उन्हें जल्दी या बाद में वैसे भी साफ़ करना होगा।
माइक शेरिल 'कैट रिकॉल'

7
मैं दिल से सार्थक उपनामों की सिफारिश करता हूं। टी 1, टी 2 के बजाय सार्थक उपनामों के साथ एक उदाहरण देखना वास्तव में अच्छा है ... ए, बी, बी, सी, डी, ई .... जब आप कर्मचारियों जैसे उपनाम प्राप्त करते हैं तो यह वास्तव में भ्रमित हो सकता है, पते बी , खाते c, बिलिंग d, ग्राहक e
बिलथोर

4
मुझे लगता है कि आसान रख-रखाव के लिए भी हर कॉलम रेफरेंस पर अन्य का उपयोग करना महत्वपूर्ण है। निश्चित रूप से केवल एक तालिका में xyzjunk नाम का फ़ील्ड है, लेकिन कौन सा? जब आप जटिल रिपोर्टिंग क्वेरी लिखते हैं, तो हमेशा यह जानना उपयोगी होता है कि आपके क्षेत्र कहाँ आए हैं।
HLGEM

1
यह भी आवश्यक है जब आप एक व्युत्पन्न तालिका में शामिल हों।
HLGEM

@HLGEM - दोनों उत्कृष्ट अंक।
निक चामास

12

मुझे लगता है कि उपनाम का उपयोग करने से किसी क्वेरी की पठनीयता में मदद मिलती है यदि तालिका के नाम लंबे या एक-दूसरे के समान हैं, तो इसे पढ़ने वाला कोई भी व्यक्ति जल्दी से गलती कर सकता है। क्या आपको लगता है कि यह ...

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' 

क्या इससे अधिक पठनीय है?

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' 

टेबल अलायस के रूप में आपके द्वारा उपयोग किए जाने के आधार पर, यह किसी व्यक्ति को पढ़ने और समझने के लिए क्वेरी को बहुत सरल बना सकता है।


2
मैं हमेशा ऐसे शिकारियों को मारना और मारना चाहता हूं जो अपनी मेजों को अलियास नहीं करते हैं (ठीक से नहीं)। वह पहला उदाहरण मेरी आंखों से खून बहता है। और किसी तरह जब वे ऐसा करते हैं तो वे अपना कोड नहीं बनाते हैं ताकि मैं इसे बिना स्क्रॉल किए भी देख सकूं (जैसे आपने किया)।
HLGEM

5

टेबल अलियासिंग (छोटी तालिका नामों के लिए) बुरा अभ्यास नहीं है।

मैं सामान्य रूप से इसका उपयोग तब करता हूं जब टैबलेनम्स लंबे होते हैं और फिर केवल उस उपनाम का उपयोग करते हैं जो समझ में आता है:

SELECT tTable.stuff FROM track_table tTable;

यदि आप पठनीयता में सुधार करना चाहते हैं, तो आप ASकीवर्ड का उपयोग कर सकते हैं :

SELECT tTable.stuff FROM track_table AS tTable;

लेकिन, जैसा कि आपको सिंटैक्स की आदत है, इसकी जरूरत नहीं है।


0

अपने प्रश्नों की पठनीयता को बढ़ाने के लिए आप इसका उपयोग कर सकते हैं। छोटे उपनाम का उपयोग करने के बजाय, उदाहरण के लिए, जिस डेटा से आप जुड़ रहे हैं, उसका वर्णन करने के लिए अपने उपनाम का उपयोग करें

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या t1) का उपयोग करते हुए एक क्वेरी को पढ़ना मुश्किल बना सकता है क्योंकि आपको जाने की आवश्यकता है और उपनाम खोजने के लिए उपनाम का अर्थ है, एक अच्छी तरह से नामित उपनाम अक्सर तालिका का उपयोग करने की तुलना में क्वेरी को अधिक पठनीय बना सकता है। नाम।


-1

यह "खराब अभ्यास" के बारे में एक सवाल है। जवाब "कीस्ट्रोक्स सेविंग" के बारे में प्रतीत होते हैं।

व्यक्तिगत रूप से, मेरी कोडिंग गति मेरी विचार गति से सीमित है, मेरी टाइपिंग गति से नहीं। मुझे लगता है कि कोड की तुलना में पढ़ने के लिए बहुत अधिक टेबल उपनामों के साथ कोड मिलता है जो तालिका नामों का उपयोग स्वयं करता है। टेबल उपनाम अप्रत्यक्ष के एक और स्तर को जोड़ते हैं।

हालांकि, अधिकांश प्रोग्रामर टेबल अलायस का उपयोग करते हैं (हालांकि मैं नहीं)। कुछ "एसक्यूएल विकास वातावरण" ऐसा करने में बहुत आसान बनाते हैं, और कुछ शिक्षक टेबल अलायस को स्वचालित रूप से सिखाते हैं, विशेष रूप से "ज्वाइन सिंटैक्स" सीखने के हिस्से के रूप में।

टेबल अलायस का उपयोग करना बुरा अभ्यास नहीं है, लेकिन कभी-कभी मुझे कोड के माध्यम से जाना पड़ता है और यह समझने के लिए कि क्या चल रहा है, मूल तालिका के नामों के साथ उपनामों को बदलना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.