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

आंतरिक जुड़ाव का उपयोग करके SQL में लिखी गई विरासत क्वेरी लिखना?

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

यदि आप एक मनमाना निर्देशित ग्राफ़ लागू कर रहे हैं (उदाहरण के लिए, आपके पास एक "लेखक" प्रोफ़ाइल है जो लेख प्रकाशित कर सकती है लेकिन टिप्पणियों को मॉडरेट नहीं कर सकती है, और एक "मॉडरेटर" प्रोफ़ाइल जो टिप्पणियों को मॉडरेट कर सकती है लेकिन लेख प्रकाशित नहीं कर सकती है), तो आप देखना चाहेंगे किसी अन्य समाधान के लिए।

एक संभावना यह है कि विरासत को छोड़ दिया जाए और प्रत्येक समूह के लिए मैन्युअल रूप से अनुमतियाँ सेट की जाएँ।

एक और संभावना है कि इनहेरिटेंस टेबल का उपयोग प्रत्यक्ष और अप्रत्यक्ष दोनों तरह के इनहेरिटेंस को स्टोर करने के लिए किया जाए (अर्थात, एक नोड "प्रत्यक्ष" संबंध का उपयोग करके अपने सभी बच्चों से संबंधित होगा, साथ ही साथ इसके सभी वंशज "अप्रत्यक्ष" संबंध का उपयोग करेंगे)। इस रणनीति के लिए आपको तालिका में सभी अप्रत्यक्ष संबंधों को फिर से बनाने की आवश्यकता है जब भी आप किसी एक प्रत्यक्ष संबंध को बदलते हैं (यह एक साधारण INSERT SELECT का उपयोग करके किया जा सकता है। ), लेकिन सभी वंशजों तक पहुंचने के लिए केवल एक ही शामिल होने की आवश्यकता का लाभ है।

मूल विचार है:

CREATE TABLE group_inherit (
  parent INT NOT NULL, 
  child INT NOT NULL, 
  distance INT NOT NULL, 
  PRIMARY KEY (parent,child)
);

/* Clean up indirect relations */
DELETE FROM group_inherit WHERE distance <> 0;

/* Repeat this for each D > 0 until the maximum distance is reached */
INSERT IGNORE INTO (parent, child, distance) 
SELECT fst.parent, snd.child, D
FROM group_inherit fst
INNER JOIN group_inherit snd ON snd.parent = fst.child
WHERE fst.distance = 0 AND snd.distance = D - 1;

/* Select all permissions for a user type */
SELECT perm.*
FROM group_permissions perm
INNER JOIN group_inherit ON perm.moderator = child
WHERE parent = ?

दूरी पर लूप तब तक किया जाना चाहिए जब तक कि दूरी डी -1 के और तत्व उपलब्ध न हों, जो कि एक चुनिंदा क्वेरी का उपयोग करके किया जा सकता है या, यदि आपके पास है, तो मेटा-सूचना कितनी लाइनें डाली गई थी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डुप्लीकेट कुंजी अद्यतन पर कार्यान्वयन/डिज़ाइन

  2. मैं प्रति पृष्ठ उपयोग किए गए MySQL प्रश्नों की कुल संख्या की गणना कैसे कर सकता हूं?

  3. MySQL डेटाबेस में Backbone.js मॉडल डालें

  4. PHP में दिनांक स्वरूप परिवर्तित करना

  5. Laravel:कैसे विधि का उपयोग कर कस्टम सॉर्ट किए गए वाक्पटु संग्रह प्राप्त करने के लिए?