PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

SQL में नेस्टेड संबंधों के लिए सरलता और कुशलता से क्वेरी कैसे करें?

किसी भी प्रश्न के साथ, सबसे कुशल तरीका "यह निर्भर करता है" है। खेल में कई चर हैं - तालिकाओं में पंक्तियों की संख्या, पंक्ति की लंबाई, क्या सूचकांक मौजूद हैं, सर्वर पर रैम आदि।

इस तरह की समस्या से निपटने का सबसे अच्छा तरीका है (सोच रखरखाव और दक्षता के लिए एक व्यापक दृष्टिकोण) सीटीई का उपयोग करना है, जो आपको एक अस्थायी परिणाम बनाने और अपनी पूरी क्वेरी में उस परिणाम का पुन:उपयोग करने की अनुमति देता है। सीटीई कीवर्ड के साथ का उपयोग करते हैं, और अनिवार्य रूप से उर्फ ​​​​परिणाम को एक तालिका के रूप में उपयोग करते हैं, ताकि आप इसके खिलाफ कई बार शामिल हो सकें:

WITH user_memberships AS (
    SELECT *
    FROM memberships
    WHERE user_id = ${id}
), user_apps AS (
    SELECT *
    FROM apps
    INNER JOIN user_memberships
        ON user_memberships.team_id = apps.team_id
), user_collections AS (
    SELECT *
    FROM collections
    INNER JOIN user_memberships
        ON user_memberships.team_id = collections.team_id
), user_webhooks AS (
    SELECT *
    FROM webhooks
    LEFT OUTER JOIN user_collections ON user_collections.id = webhooks.collection_id
    INNER JOIN user_memberships
        ON user_memberships.team_id = webhooks.team_id
        OR user_memberships.team_id = user_collections.team_id
)

SELECT events.* 
FROM events
WHERE app_id IN (SELECT id FROM user_apps)
OR collection_id IN (SELECT id FROM user_collections)
OR membership_id IN (SELECT id FROM user_memberships)
OR team_id IN (SELECT team_id FROM user_memberships)
OR user_id = ${id}
OR webhook_id IN (SELECT id FROM user_webhooks)
;

इसे इस तरह करने के फायदे हैं:

  1. प्रत्येक सीटीई उचित जॉइन पर एक इंडेक्स का लाभ उठा सकता है और जटिल विधेय की एक श्रृंखला को हल करने के लिए निष्पादन योजनाकार प्रयास करने के बजाय, उस सबसेट के लिए तेजी से परिणाम लौटा सकता है
  2. सीटीई को व्यक्तिगत रूप से बनाए रखा जा सकता है, जिससे सबसेट के साथ समस्या निवारण करना आसान हो जाता है
  3. आप DRY सिद्धांत का उल्लंघन नहीं कर रहे हैं
  4. यदि CTE का मूल्य क्वेरी के बाहर है, तो आप इसे एक संग्रहीत कार्यविधि में स्थानांतरित कर सकते हैं और इसके बजाय इसका संदर्भ दे सकते हैं


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RoR:postgres में change_column नहीं कर सकता, MySQL में ठीक (विकास के लिए MySQL, Heroku पर Postgres)

  2. मेरा पोस्टग्रेज डेटाबेस कुछ समय के लिए क्यों काम कर रहा है और फिर एक बार फिर से शुरू होने पर सर्वर शुरू करने में सक्षम नहीं है?

  3. कॉलम मौजूद नहीं है?

  4. पोस्टग्रेज - त्रुटि:ऑपरेटर मौजूद नहीं है

  5. NodeJS- PostgreSQL क्वेरी में स्ट्रिंग की सरणी जोड़ें