24

मैं एक वेब अनुप्रयोग विकसित कर रहा हूं जो थ्रेडेड टिप्पणियों का समर्थन कर सकता है। मुझे प्राप्त वोटों की संख्या के आधार पर टिप्पणियों को पुनर्व्यवस्थित करने की क्षमता की आवश्यकता है।मैं थ्रेडेड टिप्पणियों को कैसे कार्यान्वित करूं?

मैं अतः इसे कैसे करना पर समुदाय से आदानों जानकर बहुत खुशी होगी (कैसे लड़ी reddit टिप्पणी काम के समान)।

मैं कैसे टिप्पणियां डिजाइन चाहिए तालिका?

Comment 
    id 
    parent_post 
    parent_comment 
    author 
    points 

क्या परिवर्तन इस संरचना के लिए किया जाना चाहिए: यहाँ संरचना मैं अब का उपयोग कर रहा है?

कैसे मैं उन्हें सही ढंग से प्रदर्शित करने के लिए इस तालिका से जानकारी प्राप्त करना चाहिए? (किसी भी भाषा में कार्यान्वयन का स्वागत है। मैं सिर्फ यह जानना चाहता हूं कि इसे सर्वोत्तम तरीके से कैसे किया जाए)

इस सुविधा को लागू करते समय मुझे देखभाल करने की आवश्यकता है ताकि सीपीयू पर कम भार हो /डेटाबेस?

अग्रिम धन्यवाद।

उत्तर

14

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

आपका तालिका लाभ यह है कि आप 1 बार में एक पोस्ट पर सभी टिप्पणियां प्राप्त नहीं कर सकते हैं, parentpost पर छान कर दिया है। जैसा कि आपने पाठ्यपुस्तक/बेवकूफ तरीके से टिप्पणी के माता-पिता को परिभाषित किया है, आपको स्मृति में पेड़ बनाना होगा (नीचे देखें)। एक पूर्व calc आधारित दृष्टिकोण यहाँ की मेरी विवरण देखें: http://www.llblgen.com/tinyforum/GotoMessage.aspx?MessageID=17746&ThreadID=3208 या using balanced trees described by CELKO here द्वारा:

या अभी तक एक और दृष्टिकोण आप डीबी से पेड़ प्राप्त करने के लिए चाहते हैं, आप एक पेड़ स्टोर करने के लिए एक अलग तरह की जरूरत है: चयन .. टिप्पणी जहां ParentPost = @id आदेश ParentComment द्वारा से: http://www.sqlteam.com/article/more-trees-hierarchies-in-sql

आप स्मृति में एक पदानुक्रम में सब कुछ लाने और वहाँ पेड़ का निर्माण करते हैं, यह तथ्य यह है कि प्रश्न बहुत सरल है की वजह से अधिक कुशल हो सकता एएससी

कि क्वेरी के बाद, आप buil स्मृति में वृक्ष केवल 1 शब्दकोश के साथ है जो tuple commentID - टिप्पणी का ट्रैक रखता है। अब आप परिणाम के माध्यम से चलते हैं और फ्लाई पर पेड़ का निर्माण करते हैं: आप जिस भी टिप्पणी में भाग लेते हैं, आप शब्दकोश में अपने माता-पिता को देख सकते हैं और फिर उस शब्दकोश में वर्तमान में संसाधित टिप्पणी को संग्रहीत कर सकते हैं।

+0

"स्मृति में" क्या आप एप्लिकेशन स्तर पर हैं? – Ced

3

आपका वर्तमान डिजाइन छोटे पदानुक्रम (कम से कम हजार आइटम)

आप, एक certian स्तर या गहराई पर लाने के लिए अपने संरचना के लिए एक 'स्तर' आइटम जोड़ सकते हैं और के हिस्से के रूप में यह गणना करने के लिए चाहते हैं के लिए मूल रूप से ठीक है बचाने

यदि प्रदर्शन एक मुद्दा एक सभ्य कैश का उपयोग

+0

मुझे स्तर समझ में नहीं आता है? –

3

मैं ऊपर तालिका के लिए नए क्षेत्रों में निम्नलिखित जोड़ना होता है:

  • thread_id: एक विशिष्ट वस्तु से जुड़ी सभी टिप्पणियों के लिए पहचानकर्ता

  • तारीख: टिप्पणी तिथि (क्रम में टिप्पणी प्राप्त करते समय की अनुमति देता है)

  • रैंक: टिप्पणी रैंक (रैंकिंग द्वारा प्राप्त करने में कठिनाई टिप्पणी आदेश की अनुमति देता है)

इन क्षेत्रों का उपयोग करके आप कर सकेंगे:

  1. एक भी सेशन में एक थ्रेड में सभी टिप्पणियां प्राप्त
  2. +०१२३५१६४१०६१
  3. एक सूत्र में आदेश टिप्पणियां करना भी तारीख या रैंक

द्वारा दुर्भाग्य से अगर आप अपने प्रश्नों एसक्यूएल मानक को डीबी पास सुरक्षित रखना चाहते हैं आप स्मृति में पेड़ से बनाना होगा। कुछ डीबीएस श्रेणीबद्ध डेटा के लिए विशेष प्रश्नों पेशकश कर रहे हैं (फ़े ओरेकल)

./alex

+0

एलेक्स, उत्तर के लिए धन्यवाद, लेकिन मुझे आपके कुछ बिंदुओं को समझ में नहीं आया। मुझे लगता है कि thread_id post_id के समान है, दिनांक को ऑटो-इंक्रिमेंटिंग आईडी, रैंक = पॉइंट्स द्वारा प्रतिस्थापित किया जा सकता है। मैंने अपने डिजाइन में यही किया है। क्या आप कृपया मेरे डिजाइन और प्रस्तावित डिजाइन में किसी भी अंतर को स्पष्ट कर सकते हैं? – Niyaz

+0

@Niyaz: मुझे लगता है कि आपको अपने प्रश्न को संपादित करने की आवश्यकता हो सकती है क्योंकि मुझे post_id नहीं दिख रहा है (और वास्तव में मैंने अंक गलत समझा)। thread_id: थ्रेड में सभी टिप्पणियों के लिए अद्वितीय आईडी (शंकु के एक टुकड़े से जुड़ा हुआ)। autoincrement आदेश प्रदान कर सकता है लेकिन एक तारीख के बराबर नहीं है (लगभग सभी मंचों की जांच करें)। – alexpopescu

+0

मैं उलझन में था। यदि "parent_comment" माता-पिता की टिप्पणी आईडी को इंगित करता है, तो मैं हवा को साफ़ करने के लिए इसे "parent_comment_id" नाम दूंगा। मुझे यकीन नहीं है कि "parent_post" का अर्थ क्या है और यह "parent_comment" से अलग क्यों है। –

4

युगल बातें भी विचार करने के लिए ...

1) जब आप कहते हैं कि "प्रकार reddit की तरह" रैंक या के आधार पर तारीख, क्या आपका मतलब शीर्ष-स्तर या पूरी चीज है?

2) जब आप नोड हटाते हैं, तो शाखाओं के साथ क्या होता है? क्या आप उन्हें फिर से माता-पिता करते हैं? मेरे कार्यान्वयन में, मैं सोच रहा हूं कि संपादक निर्णय लेंगे - या तो नोड को छुपाएं और इसे दृश्यमान बच्चों के साथ "टिप्पणी छुपाएं" के रूप में प्रदर्शित करें, टिप्पणी छुपाएं और इसके बच्चे हैं, या पूरे पेड़ को नूक करें। पुन: parenting आसान होना चाहिए (केवल चिद्रेन के माता-पिता को हटाए गए माता-पिता पर सेट करें), लेकिन पूरे पेड़ को शामिल करने वाला कुछ भी डेटाबेस में लागू करना मुश्किल लगता है।

मैं PostgreSQL के लिए ltree मॉड्यूल देख रहा हूं। इसे पेड़ के हिस्सों को थोड़ा तेज़ी से शामिल करने के लिए डेटाबेस संचालन करना चाहिए।

ltreetest=# select path from test where path <@ 'Top.Science'; 
       path     
------------------------------------ 
Top.Science 
Top.Science.Astronomy 
Top.Science.Astronomy.Astrophysics 
Top.Science.Astronomy.Cosmology 

हालांकि, यह अपने आप ही रेफेरेंन्शिअल सत्यनिष्ठा के किसी भी प्रकार सुनिश्चित नहीं करता है: यह मूल रूप से आप तालिका की तरह लग रहा है कि एक क्षेत्र की स्थापना की सुविधा देता है। दूसरे शब्दों में, "Top.Science" या "Top" के रिकॉर्ड के बिना आपके पास "Top.Science.Astronomy" के लिए रिकॉर्ड हो सकते हैं। लेकिन यह आप करते हैं क्या है सामान की तरह:

-- hide the children of Top.Science 
UPDATE test SET hide_me=true WHERE path @> 'Top.Science'; 

या

-- nuke the cosmology branch 
DELETE FROM test WHERE path @> 'Top.Science.Cosmology'; 

पारंपरिक "comment_id"/"PARENT_ID" दृष्टिकोण संग्रहित प्रक्रियाओं का उपयोग कर के साथ संयुक्त हैं, तो मैं तुम्हें मिल सकता है सोच रहा हूँ दोनों दुनिया के सर्वश्रेष्ठ।आप अपने "पथ" का उपयोग कर डेटाबेस में टिप्पणी वृक्ष को जल्दी से पार कर सकते हैं और फिर भी "comment_id"/"parent_id" के माध्यम से संदर्भित अखंडता सुनिश्चित कर सकते हैं।

CREATE TABLE comments (
comment_id SERIAL PRIMARY KEY, 
parent_comment_id int REFERENCES comments(comment_id) ON UPDATE CASCADE ON DELETE CASCADE, 
thread_id int NOT NULL REFERENCES threads(thread_id) ON UPDATE CASCADE ON DELETE CASCADE, 
path ltree NOT NULL, 
comment_body text NOT NULL, 
hide boolean not null default false 
); 

एक टिप्पणी देखने के लिए पथ स्ट्रिंग

<thread_id>.<parent_id_#1>.<parent_id_#2>.<parent_id_#3>.<my_comment_id> 

इस प्रकार "1" के एक comment_id एक रास्ता होता है के साथ की धागा "102" एक रूट टिप्पणी हो जैसे: मैं की तरह कुछ envisioning कर रहा हूँ का:

102.1

और एक बच्चे जिसका comment_id है "3" होगा:

102.1.3

एक "3" होने आईडी "31" और "54" के के कुछ बच्चों होगा:

102.1.3.31 
102.1.3.54 

नोड "3" और उसके बच्चों को छुपाने के लिए, यदि आप इस समस्या होगी :

UPDATE comments SET hide=true WHERE path @> '102.1.3'; 

मुझे पता नहीं है - यह अनावश्यक ओवरहेड जोड़ सकता है। इसके अलावा मुझे नहीं पता कि कितनी अच्छी तरह से बनाए रखा है ltree है।

संबंधित मुद्दे