2009-03-04 12 views
6

विकी जैसी डेटा स्टोरेज बनाने के लिए किसी को एपीआई (PHP बेहतर है लेकिन मुझे किसी भी भाषा में दिलचस्पी होगी) के बारे में पता है?अपनी खुद की प्लेनटेक्स्ट विकी (एक डीबी के अंदर विकी) रोलिंग

अपने स्वयं के सादे टेक्स्ट विकी को घुमाने पर किसी भी संसाधन के बारे में कैसे? अन्य सादे टेक्स्ट विकी टेक्स्ट फ़ाइल के प्रारूप को कैसे संभालते हैं?

मुझे समझ में आता है कि मैं प्रारूपण के लिए मार्कडाउन या वस्त्र का उपयोग कर सकता हूं। लेकिन मुझे सबसे ज्यादा दिलचस्पी है कि बहु-उपयोगकर्ता संपादन के सादे टेक्स्ट स्टोरेज से कैसे संपर्क करें।

मैं एक वेब एप्लिकेशन लिख रहा हूं जो मुख्य रूप से डेटाबेस संचालित है। मैं इस डेटाबेस का कम से कम एक टेक्स्ट फ़ील्ड विकी-जैसी प्रारूप में होना चाहता हूं। विशेष रूप से, इस पाठ को कई उपयोगकर्ताओं द्वारा संपादित किया जा सकता है जिसमें किसी भी संस्करण पर वापस रोल करने की क्षमता है। Last.FM के विकी/जैव अनुभाग को सोचें (लगभग पूरी साइट को प्रति कलाकार इस अनुभाग को छोड़कर डेटाबेस द्वारा सख्ती से संरचित किया गया है)।

अब तक, मीडियाविकि को अलग करने और डेटाबेस में इसे घुमाने का मेरा दृष्टिकोण ओवरकिल जैसा लगता है। मुझे लगता है कि यह अपने सादे टेक्स्ट विकी को रोल करना बहुत आसान होगा, और इस फ़ाइल को डेटाबेस के उपयुक्त टेक्स्ट फ़ील्ड में स्टोर करें।

+0

आप डेटाबेस या कुछ और करने के लिए नए तालिकाओं जोड़ने में असमर्थ हैं? मैं निम्नलिखित नहीं हूं कि आप डेटाबेस के अंदर "सादा टेक्स्ट" विकी क्यों बनाना चाहते हैं। शायद मैं आपकी शब्दावली को समझ नहीं रहा हूं। –

+0

मैं अपने डेटाबेस – ack

+0

में एक भी पाठ क्षेत्र में संग्रहीत एक भी विकि पृष्ठ के बराबर करना चाहते हैं यह स्पष्ट नहीं है कि आपके सवाल का जवाब है, "MySql बड़े सामान के लिए एक पाठ डेटाप्रकार है" या यदि आप के लिए पूछ रहे हैं संस्करण आदि के बारे में कुछ और जटिल –

उत्तर

15

तो, मूल रूप से यह "मैं अपने डीबी में संस्करण टेक्स्ट जानकारी कैसे करूं"।

अच्छा, सबसे आसान तरीका डेटा की प्रतिलिपि बनाना है।

बस, "संस्करण" तालिका बनाएं जिसमें डेटा के "पुराने संस्करण" हों और इसे अपनी मुख्य तालिका में वापस लिंक करें।

create table docs { 
    id integer primary key not null, 
    version integer not null, 
    create_date date, 
    change_date date, 
    create_user_id integer not null references users(id), 
    change_user_id integer references users(id), 
    text_data text 
} 

create table versions { 
    id integer primary key not null, 
    doc_id integer not null references docs(id), 
    version integer, 
    change_date date, 
    change_user integer not null references users(id), 
    text_data text 
} 

जब भी आप अपने मूल दस्तावेज को अद्यतन, तो आप इस तालिका में पुराने पाठ मान की प्रतिलिपि, उपयोगकर्ता और परिवर्तन की तिथि से कॉपी और संस्करण टक्कर।

select version, change_date, change_user, text_data 
    into l_version, l_change_data, l_change_user, l_text_data 
from docs where id = l_doc_id; 

insert into versions values (newid, l_doc_id, l_version, 
    l_change_date, l_change_user, l_text_data); 

update docs set version = version + 1, change_date = now, 
    change_user = cur_user, text_data = l_new_text where id = l_doc_id; 

यदि आपका डीबी उनको समर्थन करता है तो आप इसे ट्रिगर में भी कर सकते हैं।

इस विधि के साथ दोष यह है कि यह डेटा की एक पूर्ण प्रति है (इसलिए यदि आपके पास एक बड़ा दस्तावेज़ है, तो संस्करण बड़ा रहता है)। आप diff (1) और पैच (1) जैसे कुछ का उपयोग करके कम कर सकते हैं।

उदाहरण के लिए:

diff version2.txt version1.txt > difffile 

तो फिर तुम के रूप में "संस्करण 1" कि difffile स्टोर कर सकते हैं।

आदेश संस्करण 2 से संस्करण 1 की वसूली के लिए, आप संस्करण 2 डेटा, उस पर पैच चलाने diff फ़ाइल डेटा का उपयोग कर हड़पने, और है कि आप v1 देता है। (एक बार v2 प्राप्त करने के लिए, और फिर पुन v1 पाने के लिए)

आप v1 पर v3 से जाना चाहते हैं, तो आप इस दो बार करने की ज़रूरत है।

आप अपने संग्रहण बोझ को कम करती है, लेकिन अपने प्रसंस्करण (जाहिर है) बढ़ जाती है, तो आप का न्याय करने के लिए कैसे आप ऐसा करना चाहते हैं होगा।

+0

अच्छा दृष्टिकोण, मैं इसमें देख लूंगा! – ack

+0

शानदार सरल और प्रभावी http://upload.wikimedia.org/wikipedia/commons/4/41/Mediawiki-database-schema.png MediaWiki की तुलना में – Cherian

+0

btw y यू में CHANGE_DATE तारीख और change_user_id पूर्णांक संदर्भ उपयोगकर्ताओं (आईडी) की आवश्यकता है दस्तावेज़ तालिका? संस्करण तालिका से अनुमानित नहीं किया जा सकता है? – Cherian

0

यहां विकीमैट्रिक्स पर सभी 12 विकीज़ की एक सूची है जो PHP में लिखी गई हैं और टेक्स्ट फ़ाइलों का उपयोग करके उनका संग्रहण करते हैं।

http://www.wikimatrix.org/search.php?sid=1760

0

ऐसा लगता है कि आप अनिवार्य रूप से सिर्फ संस्करण नियंत्रण के लिए देख रहे हैं: शायद उनमें से एक आप डेटाबेस में अनुकूलित कर सकते हैं एक भंडारण विधि होगा। यदि ऐसा है, तो आप एक diff एल्गोरिदम में देखना चाह सकते हैं।

यहां विकिपीडिया Diff पृष्ठ है।

मैंने एक त्वरित php diff google खोज किया, लेकिन वास्तव में एक सभ्य उदाहरण के रूप में कुछ भी नहीं खड़ा था, क्योंकि मेरे पास केवल मूल PHP ज्ञान है।

2

विल के विशाल जवाब सही पर है, लेकिन अभिव्यक्त किया जा सकता, मुझे लगता है कि: आप संस्करणों स्टोर करने के लिए की जरूरत है, और फिर आप मेटाडाटा स्टोर करने के लिए की जरूरत है (जो क्या जब डेटा की)।

लेकिन आपका प्रश्न विकी जैसी संस्करणों पर संसाधनों के बारे में था। मेरे पास कोई नहीं है (ठीक है, एक: Will's answer above)। हालांकि, विकिस के भंडारण के बारे में, मेरे पास एक है। the comparison matrix from DokuWiki देखें। मुझे पता है। आप सोच रहे हैं "मुझे क्या ख्याल है कि डीबी के ब्रांड किस विकी का उपयोग करते हैं?" क्योंकि DokuWiki सादा पाठ फ़ाइलों का उपयोग करता है। आप उन्हें खोल सकते हैं और वे वास्तव में सादे हैं। तो यह एक दृष्टिकोण है, और उनके पास कुछ दिलचस्प तर्क हैं कि क्यों डीबीएमएस जाने का सबसे अच्छा तरीका नहीं है। वे ज्यादा मेटाडाटा भी नहीं रखते हैं: अधिकांश चीजें फ्लैट फाइलों के माध्यम से स्वयं की जाती हैं।

DokuWiki की बात के लिए आपको लगता है कि शायद यह एक अपेक्षाकृत सरल समस्या है है (कितनी अच्छी तरह आप इसे :) को हल करना चाहते हैं पर निर्भर करता

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