यदि आप एक ट्री पदानुक्रम को देख रहे हैं, तो नेस्टेड सेट मॉडल काफी अच्छी तरह से काम करता है, लेकिन इसमें आपकी विरासत तालिका की संरचना में एक बड़ा बदलाव शामिल है।
यदि आप एक मनमाना निर्देशित ग्राफ़ लागू कर रहे हैं (उदाहरण के लिए, आपके पास एक "लेखक" प्रोफ़ाइल है जो लेख प्रकाशित कर सकती है लेकिन टिप्पणियों को मॉडरेट नहीं कर सकती है, और एक "मॉडरेटर" प्रोफ़ाइल जो टिप्पणियों को मॉडरेट कर सकती है लेकिन लेख प्रकाशित नहीं कर सकती है), तो आप देखना चाहेंगे किसी अन्य समाधान के लिए।
एक संभावना यह है कि विरासत को छोड़ दिया जाए और प्रत्येक समूह के लिए मैन्युअल रूप से अनुमतियाँ सेट की जाएँ।
एक और संभावना है कि इनहेरिटेंस टेबल का उपयोग प्रत्यक्ष और अप्रत्यक्ष दोनों तरह के इनहेरिटेंस को स्टोर करने के लिए किया जाए (अर्थात, एक नोड "प्रत्यक्ष" संबंध का उपयोग करके अपने सभी बच्चों से संबंधित होगा, साथ ही साथ इसके सभी वंशज "अप्रत्यक्ष" संबंध का उपयोग करेंगे)। इस रणनीति के लिए आपको तालिका में सभी अप्रत्यक्ष संबंधों को फिर से बनाने की आवश्यकता है जब भी आप किसी एक प्रत्यक्ष संबंध को बदलते हैं (यह एक साधारण 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 के और तत्व उपलब्ध न हों, जो कि एक चुनिंदा क्वेरी का उपयोग करके किया जा सकता है या, यदि आपके पास है, तो मेटा-सूचना कितनी लाइनें डाली गई थी।