2009-05-29 7 views
7

मैं एक वीडियो वेबसाइट बना रहा हूं जहां श्रेणियां घोंसला की जाएंगी:मैं डेटाबेस में नेस्टेड श्रेणियां कैसे बना सकता हूं?

उदा। प्रोग्रामिंग> सी भाषा -> एमआईटी वीडियो -> वीडियो 1 प्रोग्रामिंग -> सी भाषा -> स्टैनफोर्ड वीडियो -> वीडियो 1 प्रोग्रामिंग -> अजगर -> वीडियो 1

इन श्रेणियों और उप श्रेणियों द्वारा बनाया जाएगा फ्लाई पर उपयोगकर्ता। मुझे उन्हें दिखाने की आवश्यकता होगी क्योंकि लोग उन्हें एक नौसेना के मेनू के रूप में बनाते हैं, ताकि लोग आसानी से संग्रह ब्राउज़ कर सकें।

क्या कोई मेरी मदद कर सकता है कि मैं इस तरह के डेटाबेस बनाने के बारे में कैसे जा सकता हूं?

+0

डुप्लिकेट गहराई से नीचे जाते हैं? http://stackoverflow.com/questions/317322/optimized-sql-for-tree- संरचनाएं –

+0

https://stackoverflow.com/questions/17081951/my-sql-multiple-category-subcategory-subcategory – Calvin

उत्तर

7

Quassnoi ने कहा:

आप या तो उपयोग करना चाहिए नेस्टेड सेट या अभिभावक-बाल मॉडल।

मैं उन दोनों को लागू करने के लिए उपयोग करता था। मैं क्या कह सकता हूं:

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

एक और बिंदु, मुझे काफी तुच्छ जाना चाहिए, लेकिन:
सीधे डेटाबेस में हाथ से पदानुक्रम को बदलना बहुत मुश्किल है (यह विकास के दौरान हो सकता है)।

: तो, पहले

यहाँ इस विषय पर दो लेख हैं (एक नोड या पूरे शाखा आदि को हटाने,, माता पिता के नोड बदल रहा है एक शाखा नोड के लिए कदम) नेस्टेड सेट के साथ खेलने के लिए एक इंटरफ़ेस को लागू करने के लिए सुनिश्चित हो

अंतिम बात, मैं यह कोशिश नहीं की है, लेकिन मैंने कहीं पढ़ा है कि आप हवलदार कर सकते हैं एक नेस्टेड सेट टेबल में एक से अधिक पेड़, मेरा मतलब कई जड़ें हैं।

3

आपको या तो nested sets या parent-child मॉडल का उपयोग करना चाहिए।

Parent-child:

 
typeid parent name 

1  0  Buyers 
2  0  Sellers 
3  0  Referee 
4  1  Electrical 
5  1  Mechanic 
SELECT * 
FROM mytable 
WHERE group IN 
     (
     SELECT typeid 
     FROM group_types 
     START WITH 
       typeid = 1 
     CONNECT BY 
       parent = PRIOR typeid 
     ) 

Oracle में सभी खरीददारों का चयन करेंगे।

Nested sets:

 
typeid lower upper Name 
1  1  2  Buyers 
2  3  3  Sellers 
3  4  4  Referee 
4  1  1  Electrical 
5  2  2  Mechanic 
SELECT * 
FROM group_types 
JOIN mytable 
ON  group BETWEEN lower AND upper 
WHERE typeid = 1 

किसी भी डेटाबेस में सभी खरीददारों का चयन करेंगे।

अधिक जानकारी के लिए this answer देखें।

Nested sets क्वेरी करना अधिक आसान है, लेकिन पेड़ संरचना बनाने के लिए अद्यतन करना कठिन और कठिन है।

11

निम्नलिखित क्षेत्रों के साथ एक श्रेणियों तालिका बनाएँ:

  • CategoryID - पूर्णांक
  • CategoryName - स्ट्रिंग/Varchar/जो कुछ भी
  • ParentID - पूर्णांक

आपका ParentID फिर वापस दर्शाएंगे अपने माता-पिता की श्रेणी आईडी में।

उदाहरण:

CategoryID CategoryName ParentID 
--------------------------------- 
1   Dog   NULL 
2   Cat   NULL 
3   Poodle  1 
4   Dachsund  1 
5   Persian  2 
6   Toy Poodle 3 
+0

मैं कैसे निर्माण करूं ऐसी तालिका से नेविगेशन बनाने के लिए एक क्वेरी? क्या कोई आसान तरीका है? – MathOldTimer

+0

जेक: मुझे नहीं पता कि आप अपनी खुद की नेविगेशन कैसे करेंगे, लेकिन मानक तरीका एक प्रश्न का उपयोग करके पहले एक स्तर (जैसे शीर्ष स्तर) प्रदर्शित करना होगा जैसे कि "चयन * से tblCategories जहां पेरेंटिड न्यूल" है आपको कुत्ते और बिल्ली मिलेंगे। फिर जब आप कुत्ते पर क्लिक करते हैं तो आप "स्तर * tblCategories से चुनें * पूछताछ करके अगला स्तर प्राप्त कर सकते हैं जहां ParentID = 1" क्योंकि 1 कुत्ते का श्रेणी है। और फिर आप उसी तरह से आगे बढ़ते हैं जो आप ड्रिल करते हैं। – TheTXI

+0

धन्यवाद! यह सहायक था! – MathOldTimer

0

आपको क्या करना होगा एक बुनियादी माता पिता के बच्चे का रिश्ता है:

Category (ID: int, ParentID: nullable int, Name: nvarchar(1000)) 
5

उदाहरण अपने प्रश्न में ऐसा लगता है कि आप इसे एक के लिए संभव हो सकता है करना चाहते हैं से दिए गए श्रेणी में कई माता-पिता होने के लिए (उदाहरण के लिए, "एमआईटी वीडियो -> वीडियो 1 प्रोग्रामिंग" के साथ-साथ "वीडियो -> वीडियो 1 प्रोग्रामिंग"), जिस स्थिति में केवल एक अभिभावक कॉलम जोड़ना पर्याप्त नहीं होगा।

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

+0

धन्यवाद! जैसा मुझे चाहिए था यह बिल्कुल वैसा ही है। एक उदाहरण के रूप में मैं चाहता हूं कि "असेंबली भाषा प्राइमर वीडियो" दोनों को "रिवर्स इंजीनियरिंग बेसिक्स" के साथ-साथ "प्रोग्रामिंग भाषाएं" में सूचीबद्ध किया जाना चाहिए। – MathOldTimer

0

तालिका के PARENT_ID स्टोर करने के लिए एक बेहतर तरीका यह आईडी जैसे

100000 प्रोग्रामिंग 110000 सी भाषा 111,000 वीडियो 1 प्रोग्रामिंग 111,100 सी भाषा 111,110 स्टैनफोर्ड वीडियो

भीतर नेस्ट है

इत्यादि। इसलिए आपको आईडी को संसाधित करने के लिए एक स्क्रिप्ट चाहिए, जैसे कि पहला अंक शीर्ष स्तर की श्रेणी का प्रतिनिधित्व करता है और इसी तरह आप पदानुक्रम

+0

यह काफी दिलचस्प तरीका है। क्या आपके पास कोई विचार है कि इस तरह के डेटा को कैसे पूछना है? –

+0

क्या यह आपको 10 शीर्ष स्तर के आइटम 0-9 तक सीमित नहीं करता है?शून्य का उपयोग करने का क्या कारण है, क्या आप एक पूर्ण संख्या के पूर्णांक का उपयोग कर रहे हैं जो संभावित बच्चों की संख्या को सीमित करता है? आप नए आइटम कैसे डालेंगे और उन्हें अपडेट करेंगे? –