में पदानुक्रम डेटा को संभालना मुझे पता है कि पदानुक्रमों को संभालने का सबसे अच्छा तरीका (सर्वोत्तम अभ्यास) डाटाबेस डिज़ाइन के संबंध में क्या है। यहां एक छोटा उदाहरण है कि मैं आमतौर पर उन्हें कैसे संभालता हूं।डेटाबेस
नोड तालिका
NodeId int PRIMARY KEY
NodeParentId int NULL
DisplaySeq int NOT NULL
Title nvarchar(255)
पूर्वज टेबल
NodeId int
AncestorId int
Hops int
NodeId, AncestorId पर इंडेक्स साथ
, होप्स
टेबल्स इस तरह दिखेगा:
नोड तालिका
NodeId NodeParentId DisplaySeq Title
1 NULL 1 'Root'
2 1 1 'Child 1'
3 1 2 'Child 2'
4 2 1 'Grandchild 1'
5 2 2 'Grandchild 2'
पूर्वज टेबल
NodeId AncestorId Hops
1 NULL 0
1 1 0
2 1 1
2 2 0
3 1 1
3 3 0
4 1 2
4 2 1
4 4 0
5 1 2
5 2 1
5 5 0
इस डिजाइन के साथ
, मैंने पाया है कि बड़े पदानुक्रम के साथ मैं पर शामिल होने से बहुत जल्दी पदानुक्रम के एक पूरा खंड प्राप्त कर सकते हैं AncestorId = लक्ष्य NodeId के लिए पूर्वज तालिका, जैसे:
SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
यह भी ई है asy प्रत्यक्ष बच्चों के साथ
SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
AND Hops = 1
मैं जानते हुए भी क्या अन्य समाधान आप बात के इस प्रकार के लिए इस्तेमाल किया हो सकता है में दिलचस्पी रखता हूँ मिलता है। मेरे अनुभव में, पदानुक्रम बहुत बालों वाले हो सकते हैं, और उनके पुनर्प्राप्ति को अनुकूलित करने का कोई भी तरीका बहुत महत्वपूर्ण है।
नेस्टेड सेट! यही वह शब्द है जिसे मैं ढूंढ रहा था! – n8wrl
सुंदर दिलचस्प लेख। एक समस्या जो मैंने हमेशा की है वह एक नोड जोड़ने/हटाने पर है, इसके बाद आपको हर दूसरे नोड की स्थिति अपडेट करनी होगी। –
आप करते हैं। और यही वह जगह है जहां टॉम एच का जवाब इतना महत्वपूर्ण है। मेरे लिए, यह पदानुक्रमों पर आश्चर्यजनक रूप से काम करता है, मेरे पास यह बदलाव बहुत कम है। – n8wrl