असतत डेटा संरचना में इन-टेक्स्ट मेटाडेटा को संग्रहीत करना


14

मैं एक एप्लिकेशन विकसित कर रहा हूं, जिसे इनलाइन , इंटीटेक्स्ट मेटाडेटा को स्टोर करना होगा । मेरे कहने का मतलब यह है कि निम्नलिखित हैं: मान लें कि हमारे पास एक लंबा पाठ है, और हम एक विशिष्ट शब्द, या पाठ के वाक्य से जुड़े कुछ मेटाडेटा संग्रहीत करना चाहते हैं।

इस जानकारी को संग्रहीत करने का सबसे अच्छा तरीका क्या होगा?

मेरा पहला विचार पाठ में किसी प्रकार के Markdownवाक्य रचना को शामिल करना था जिसे फिर से प्राप्त करने पर ध्यान दिया जाएगा। कुछ इस तरह दिख रहा है:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[@note this sounds really funny latin]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

इससे दो समस्याएं सामने आ सकती हैं जिनके बारे में मैं सोच सकता हूं:

  1. एक अपेक्षाकृत छोटा, यह है कि अगर कहा गया वाक्यविन्यास उक्त पाठ पर सौभाग्य से हो, तो यह पार्सिंग के साथ गड़बड़ कर सकता है।
  2. सबसे महत्वपूर्ण यह है कि यह इस मेटाडेटा को पाठ से अलग नहीं रखता है।

मैं इस डेटा को रखने के लिए एक असतत डेटा संरचना रखना चाहूंगा, एक अलग डीबी टेबल जिसमें ये मेटाडेटा संग्रहीत हैं, ताकि मैं उन्हें असतत तरीकों से उपयोग कर सकूं: क्वेरी करना, आंकड़े, सॉर्ट करना, और इसी तरह।


संपादित करें: चूंकि उत्तरदाता ने अपना उत्तर हटा दिया है, इसलिए मुझे लगता है कि यहां अपना सुझाव जोड़ना अच्छा हो सकता है, क्योंकि यह एक व्यावहारिक सुझाव था जो इस पहली अवधारणा पर विस्तारित हुआ था। पोस्टर एक समान सिंटैक्स का उपयोग करने के लिए, लेकिन करने के लिए मेटाडाटा से जोड़ने के लिए सुझाव PRIMARY KEYके metadataडेटाबेस तालिका।

कुछ इस तरह दिखेगा:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[15432]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

नीचे दी गई मिसाल के अनुसार आवश्यक, queriable जानकारी वाली टेबल रो की कहां 15432होगी ID


मेरा दूसरा विचार इस तरह की जानकारी को एक डीबी टेबल में इस तरह से देखना था:

TABLE: metadata

ID    TEXT_ID    TYPE    OFFSET_START    OFFSET_END    CONTENT
1     lipsum     note    68              79            this sounds really funny latin

इस तरह मेटाडेटा में एक अद्वितीय आईडी होगी, text_idजो ग्रंथों को संग्रहीत करने के लिए टेबल से जुड़ी एक विदेशी कुंजी के रूप में होगी और यह एक साधारण चरित्र ऑफसेट रेंज का उपयोग करके डेटा को पाठ के साथ कनेक्ट करेगी ।

यह मेटाडेटा से डेटा को अलग रखने की चाल को करेगा , लेकिन एक समस्या जिसे मैं तुरंत इस दृष्टिकोण के साथ देख सकता हूं वह यह है कि पाठ मौलिक रूप से संपादन योग्य नहीं होगा । या, अगर मैं मेटाडाटा के अर्पण के बाद पाठ का संपादन लागू करने के लिए चाहता था, मैं मूल रूप से पात्रों संशोधन या हटाने की गणना पिछले संस्करण की तुलना में, और जाँच करें कि क्या करना होगा प्रत्येक इस संशोधनों के पहले या बाद में निकालें पात्रों कहते हैं या प्रत्येक संबंधित मेटाडेटा का।

जो, मेरे लिए, वास्तव में एक अभिमानी दृष्टिकोण की तरह लगता है।

क्या आपके पास कोई संकेत या सुझाव है कि मैं समस्या का सामना कैसे कर सकता हूं?


संपादन 2: कुछ XML समस्याएं

एक और मामला जोड़ना जो डेटा और मेटाडेटा के इस पृथक्करण के लिए काफी आवश्यक होगा।

  • मान लीजिए कि मैं अलग-अलग उपयोगकर्ताओं के लिए एक ही पाठ के अलग-अलग मेटाडेटा सेट करना संभव बनाता हूं , प्रत्येक उपयोगकर्ता की संभावना के बिना या उसके बिना वास्तव में अन्य उपयोगकर्ता मेटाडेटा प्रदर्शित कर रहा है।

मार्कडाउन प्रकार (या HTML, या XML) का कोई भी समाधान इस बिंदु पर लागू करना मुश्किल होगा। इस मामले में एकमात्र समाधान जो मैं सोच सकता था कि अभी तक एक और डीबी टेबल होगा जिसमें मूल पाठ का एकल उपयोगकर्ता संस्करण होगा, एक के उपयोग से मूल पाठ तालिका से जुड़ा होगा FOREIGN KEY

यकीन नहीं होता कि यह बहुत सुंदर है या तो।

  • XML का एक पदानुक्रमित डेटा मॉडल है: कोई भी तत्व जो किसी अन्य तत्व की सीमाओं के भीतर होता है , उसे अपना बच्चा माना जाता है , जो कि अक्सर उस डेटा मॉडल में नहीं होता है जिसकी मुझे तलाश है; एक्सएमएल में किसी भी बच्चे तत्व को मूल टैग बंद होने से पहले बंद कर दिया जाना चाहिए , जिससे तत्वों की ओवरलैपिंग की अनुमति न हो।

उदाहरण:

<note content="the beginning of the famous placeholder"> Lorem ipsum मातम बैठना <comment content="I like the sound of amet/elit"> amet </note> , consectetuer adipiscing elit </comment> , <note content="adversative?"> एसईडी व्यास nonummy nibh euismod एंड्रॉयड ut laoreet dolore मैग्ना कर्मचारी erat volutpat।<note content="funny latin"> </note> </note>

यहां हमें दो अलग-अलग समस्याएं हैं:

  1. विभिन्न तत्व ओवरलैपिंग: पहली टिप्पणी पहले नोट के भीतर शुरू होती है, लेकिन पहले नोट के अंत के बाद समाप्त होती है, अर्थात यह उसका बच्चा नहीं है।

  2. ओवरलैपिंग वाले समान तत्व: अंतिम नोट और बोल्डफेड नोट ओवरलैप; हालांकि, चूंकि वे एक ही तरह के तत्व हैं, इसलिए पार्सर पहले बंद होने पर अंतिम रूप से खुले हुए तत्व को बंद कर देगा, और अंतिम बंद होने पर पहला खोला गया तत्व, जो इस परिस्थिति में वह नहीं है, जो इरादा है।


3
ऐसा लगता है कि आप अपनी खुद की मार्कअप भाषा लिख ​​रहे हैं। आप HTML का उपयोग कर सकते हैं जिसके लिए एक अच्छी तरह से स्थापित पार्सिंग प्रणाली है और आप परिणामस्वरूप पार्स ट्री को जोड़कर अपने पाठ को संपादित कर सकते हैं। डेटाबेस स्टोरेज के लिए आप हमें NoSQL db दे सकते हैं, जैसे कि Oracle का XMLDB या Mark / Logic।
ipaul

समस्या इतनी व्यावहारिक नहीं है, जितनी कि वैचारिक। मेरा मतलब है, मैं HTML, या Markdown का उपयोग कर सकता हूं , या एक पार्सर के साथ अपनी बहुत ही सरल मार्कअप भाषा का निर्माण कर सकता हूं। समस्या यह है कि मैं उन लोगों को अलग रखना चाहता हूं। सामग्री को नंगे न्यूनतम पर रखें, हो सकता है कि सामग्री के भीतर केवल मूल समृद्ध पाठ जानकारी रखें , लेकिन बाकी सब कुछ अलग होना चाहिए।
सूर्यास्तत्त्व

1
@ सुनीतत्सव ऐसी जटिलता को जोड़ने से क्या लाभ है?
क्लेमेंट हरमैन

@ क्लेमेंटहेयरमैन ने किस जटिलता को जोड़ा? आपका मतलब डेटा और मेटाडेटा को अलग रखने की अतिरिक्त जटिलता है?
सूर्यतत्त्व

क्या पाठ को एक जीवित दस्तावेज होने का इरादा है, जिसे परिवर्तित या अद्यतन किया जा सकता है, और जिसके लिए मेटाडेटा को पाठ के कई संस्करणों पर बनाए रखने की आवश्यकता होगी? या क्या वह पाठ है जिसमें मेटाडेटा को शुद्ध रूप से स्थिर और अपरिवर्तित किया जाता है?
काइल लोअरी

जवाबों:


5

मैं आपके समाधान के मिश्रण के लिए जाऊंगा, लेकिन इसके बजाय, मैं एक मानक का उपयोग करूंगा: XML। आप इस तरह एक वाक्यविन्यास होगा

Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam <note content="It sound really funny in latin">nonummy nibh</note>
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

क्यों XML

यदि आप इसके बारे में सोचते हैं, तो यह ठीक है कि पूरे वेब को कैसे संरचित किया गया है : सामग्री (वास्तविक पाठ) जो शब्दार्थ को वहन करती है - जिसे आप मेटाडेटा कह रहे हैं - html टैग के माध्यम से।

इस तरह से आपके पास एक बहुत अच्छी दुनिया है जो खुलती है:

  • फ्री पार्सर
  • सामग्री में मेटाडेटा जोड़ने के लिए युद्ध परीक्षण तरीका है
  • उपयोग में आसानी (यह निर्भर करता है कि आप किन उपयोगकर्ताओं को लक्षित कर रहे हैं)
  • आप मेटाडेटा के बिना कच्चे पाठ को आसानी से निकाल सकते हैं, क्योंकि यह XML पार्सर पर एक मानक विशेषता है। आपकी सामग्री का एक अनुक्रमणिका संस्करण होने के लिए यह बहुत उपयोगी है, इसलिए Lorem <note>ipsum</note>जब आप lorem ips*उदाहरण के लिए खोज कर रहे हों तो उठाया जाता है ।

मार्कडाउन पर एक्सएमएल क्यों

स्टैटेक्सचेंज जैसी एक वेबसाइट मार्कडाउन का उपयोग करती है क्योंकि शब्दार्थ इसका विषय है बल्कि यह बुनियादी है: जोर, लिंक / यूआरएल, छवि, हेडर आदि। ऐसा लगता है कि शब्दार्थ आप अपनी सामग्री में जोड़ रहे हैं।

  1. अधिक जटिल
  2. परिवर्तन के अधीन या एक्स्टेंसिबल होना चाहिए

इस प्रकार मुझे लगता है कि मार्कडाउन वास्तव में अच्छा विचार नहीं होगा। इसके अलावा मार्कडाउन वास्तव में मानकीकृत नहीं है, और पार्सिंग / डंपिंग यह गधे में दर्द हो सकता है, यहां तक ​​कि एक मार्कडाउनिश सिंटैक्स भी जेएफ एटवुड के डब्ल्यूटीएफ के बारे में पोस्ट को देखता है जो वह मार्सडाउन को पार्स करने पर मिला था

डेटा और मेटाडेटा के बीच अलगाव पर

प्रति se, इस तरह की जुदाई अनिवार्य नहीं है। मुझे लगता है कि आप इसके लाभ की तलाश कर रहे हैं:

  • मेटाडेटा के बिना कच्चे माल की संभावना
  • चिंताओं का पृथक्करण: मैं डेटा के कारण मेटाडेटा में हेरफेर करते समय साइड-इफेक्ट / जटिलता ओवरहेड नहीं करना चाहता, और अन्यथा।

इन सभी चिंताओं को एक्सएमएल के उपयोग से साफ किया जाता है। XML से, आप किसी भी टैग-स्ट्रिप्ड सामग्री को आसानी से डंप कर सकते हैं, और डेटा / मेटाडेटा को अलग कर दिया जाता है, जैसे XML में विशेषता और वास्तविक टेक्स्ट को अलग किया जाता है।

इसके अलावा, मुझे नहीं लगता कि आप वास्तव में अपने मेटाडेटा को पूरी तरह से अपने डेटा के लिए बाध्य नहीं कर सकते । आप जो वर्णन करते हैं, उससे आपका मेटाडेटा आपके डेटा की एक संरचना है, अर्थात डेटा को हटाने से मेटाडेटा विलोपन होता है। यह वह जगह है जहाँ आप मेटाडेटा को सामान्य HTML / CSS से अलग करते हैं। जब html तत्व हटाया जाता है तो CSS गायब नहीं होती है, क्योंकि इसे अन्य तत्वों पर लागू किया जा सकता है। मुझे नहीं लगता कि आपके मेटाडेटा में ऐसा है।

डेटा मेटाडेटा के पास होने पर, एक्सएमएल या मार्कडाउन में, डेटा की एक आसान समझ (और शायद डीबगिंग) की अनुमति देता है। इसके अलावा, आप अपने दूसरे विचार पर जो उदाहरण देते हैं, वह कुछ जटिलता जोड़ देता है, क्योंकि प्रत्येक डेटा जो मैं पढ़ रहा हूं, उन्हें प्राप्त करने के लिए मुझे मेटाडेटा तालिका को क्वेरी करने की आवश्यकता है। यदि आपके डेटा और आपके मेटाडेटा के बीच का संबंध 1: 1 या 1: N है, तो यह IMO स्पष्ट रूप से बेकार है, और केवल जटिलता (YAGNI का एक अच्छा मामला) लाता है।


एक और फायदा जो मैं देख रहा हूं, वह स्वतंत्र रूप से मेटाडेटा का उपयोग करने में सक्षम हो रहा है , इसका मतलब है कि सामग्री के बारे में परवाह किए बिना सिर्फ मेटाडेटा को क्वेरी करना। रिश्ता डेटा क्यों होगा: 1: n का मेटाडेटा आपकी राय में "स्पष्ट रूप से बेकार" होगा?
सूर्यास्तत्त्व

आइए एक और मामला जोड़ते हैं जो डेटा समाधान के अंदर किसी भी मेटाडेटा के उपयोग को बेकार कर देता है: मैं एक ही पाठ के लिए अलग-अलग उपयोगकर्ताओं से मेटाडेटा रखना संभव बनाना चाहता हूं, जो (या नहीं हो सकता), अन्य उपयोगकर्ताओं के मेटाडेटा को देखने में सक्षम हो ।
सूर्यास्तत्त्व

मैंने अपने नए संपादन में इस पर थोड़ा विस्तार किया।
सूर्यतत्त्व

+1 यह बिल्कुल वही है जो SGML और XML के लिए डिज़ाइन किया गया था।
रॉस पैटरसन

मुझे लगता है कि एक समस्या यह है कि जहां तक ​​मुझे पता है, एक्सएमएल में किसी भी तत्व जो दूसरे के अंदर होता है उसे तत्व का बच्चा माना जाता है , और टैग को ओवरलैप करना संभव नहीं है (यानी, आपको माता-पिता को बंद करने से पहले बच्चों को बंद करना होगा। )। मेरे मामले में ऐसी कोई पदानुक्रमिक संरचना नहीं है, क्योंकि दो नोट निश्चित रूप से ओवरलैप हो सकते हैं (मेरे जवाब के अंत में जोड़ा गया उदाहरण)।
सूर्यास्तत्त्व

3

समाधान का उपयोग मामला

मैं कुछ अन्य जवाबों से असहमत हूं, सिर्फ इसलिए, क्योंकि महान समाधान, वे शायद आपके समाधान नहीं हैं। हाँ XML में यह संक्षिप्त रूप में मार्कअप शब्द है, लेकिन यह शायद आपकी स्थिति के लिए आदर्श नहीं है। यह बहुत जटिल है, यह मेटा डेटा को मूल पाठ से अलग रखने में बहुत कम सहायता प्रदान करता है। अनिवार्य रूप से यह सब कुछ मेटाडेटा के रूप में बदल जाएगा, जिससे एक अधिक वजन वाला डेटा-सेट बन जाएगा।

चूंकि संभावना नहीं है कि कोई सही समाधान या दृष्टिकोण है, सबसे अच्छा समाधान सवाल का जवाब देता है:

सिस्टम द्वारा डेटा का उपयोग कैसे किया जाएगा?

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

समस्या को समझना

ठीक है पर्याप्त टिप्पणी, चलो समस्या में खुदाई करते हैं। यह समस्या है जैसा कि मैं समझता हूं कि यह है (जाहिर है कि यह जोड़ना फायदेमंद होगा):

  • एक मूल पाठ है
    • इस मूल पाठ के बारे में अनुमान:
    • यह पाठ, कई स्वतंत्र दस्तावेजों से बना या नहीं हो सकता है
    • यह पाठ, एक या अधिक उपयोगकर्ताओं द्वारा संपादित या नहीं किया जा सकता है
    • इस पाठ में संबंधित जानकारी है। उसके द्वारा मैं यह मान रहा हूं (यदि मैं गलत हूं तो मुझे सुधारो) कि मेटाडेटा संबंधित है और वर्णनात्मक नहीं है । इसलिए यह मूल पाठ से संबंधित जानकारी संग्रहीत करता है, न कि पाठ का वर्णन करने वाली जानकारी। तो यह मूल पाठ के बारे में नोट्स स्टोर करेगा, और नहीं उदाहरण के द्वारा वर्णन है कि पाठ है एक शीर्षक है कि है बोल्ड और है एक वेबसाइट, आदि के लिए एक लिंक
    • पाठ को आसानी से मेटाडेटा से अलग फ़िल्टर किया जाना चाहिए
    • पाठ को दूषित होने से बचाया जाना चाहिए, और मेटाडेटा को दूषित करना चाहिए
  • मूल पाठ (मेटाडेटा) से संबंधित जानकारी संग्रहीत करने का एक साधन होना चाहिए
    • इस मेटाडेटा को स्वयं (मेटा) मेटाडेटा की भी आवश्यकता होती है, जो उपयोगकर्ता (या समूह) के बारे में जानकारी रखती है जैसे मेटा डेटा के लिए प्रासंगिक है, जैसे कि मेटाडेटा का वर्णन, कहते हैं कि मौसम एक नोट है, या टिप्पणी है, या विवरण आदि
    • इस मेटाडेटा (और यह (मेटा) मेटाडेटा) को मूल पाठ में परिवर्तन, मेटाडेटा के परिवर्तन और (मेटा) मेटा डेटा के परिवर्तन का सामना करने की आवश्यकता है
    • मेटाडेटा (+ मेटा-मेटाडाटा) को अच्छी तरह से संरचित करने की आवश्यकता है और आसानी से, और अनुक्रमित या यहां तक ​​कि अन्य डेटासेट के लिए संबंधपरक तरीके से शामिल किया गया है। मेटाडेटा का संबंधपरक स्वरूप केवल क्वेरीज़ तक सीमित नहीं होना चाहिए, बल्कि रिलेशनल डेटा गतिविधियों के परिणामस्वरूप अपडेट या मेटाडेटा को वापस लिखने और बदलने की सुविधा प्रदान करता है।
    • मेटाडेटा (+ मेटा-मेटाडेटा) का मान बहुत संबंधित प्रकृति में है। यह उस पल को तुरंत खो देता है, जो मूल पाठ के संबंध में खो जाता है। इस प्रकार यह मूल पाठ के संबंध में अखंडता अनिवार्य डिजाइन अनिवार्य है।
  • समस्या की प्रकृति के बारे में अन्य धारणाएँ और इसका उपयोग कैसे किया जाएगा:
    • समवर्ती विषम प्रणाली का उपयोग। कहने का तात्पर्य यह है कि उपयोगकर्ता टेक्स्ट देखने और मेटाडेटा को संपादित करने की इच्छा कर सकता है, उसी समय जब प्रशासक (या अन्य प्रक्रिया) संरचित मेटाडेटा पर संबंधपरक डेटा क्वेरी कर रहा होता है।
    • सिस्टम में कई उपयोगकर्ता होंगे
    • प्रणाली आधुनिक है। यह कहना है कि यह भंडारण स्थान, या प्रसंस्करण गति, या वास्तविक समय की अनिवार्यता से विवश नहीं है। अखंडता और उद्देश्य केंद्रित कार्यक्षमता भौतिक कंप्यूटिंग संसाधन सीमाओं की तुलना में एक उच्च प्राथमिकता है।
    • एक (यद्यपि कम) संभावना है कि सिस्टम का उपयोग और कार्यक्षमता कुछ हद तक विकसित या बदल सकती है, जैसा कि सिस्टम का उपयोग किया जाता है।

समाधान डिजाइन का निर्माण

समस्या को समझने के रूप में मैंने इसे ऊपर उल्लिखित किया है, मैं अब संभव समाधान और दृष्टिकोण सुझाना शुरू कर दूंगा जिसका उद्देश्य उपरोक्त समस्या को हल करना है।

अवयव

इसलिए मैं देखूंगा कि एक कस्टम निर्मित उपयोगकर्ता पहुंच प्रणाली होनी चाहिए। यह मूल पाठ से प्रासंगिक और अप्रासंगिक मेटाडेटा को फ़िल्टर करेगा। यह पाठ में मेटाडेटा के संपादन और देखने की सुविधा प्रदान करेगा। यह मेटाडेटा के बीच संबंधों की अखंडता को सुनिश्चित करेगा और यह मूल पाठ है। यह मेटाडेटा को संरचना देगा और एक डेटा स्रोत को रिलेशनल डेटा सिस्टम की पेशकश करेगा। यह सबसे अधिक संभावना अन्य उद्देश्य संचालित कार्यों के एक मेजबान प्रदान करेगा।

संरचना

तो के बाद से यह महत्वपूर्ण है मूल पाठ, यह सुनिश्चित करने का सबसे अच्छा तरीका करने के लिए मेटाडेटा की अखंडता बनाए रखने के लिए, मेटाडाटा रखना है इनलाइन मूल पाठ के साथ। यह लाभ प्रदान करेगा कि मूल डेटा को इस अखंडता को तोड़ने के बिना आत्मविश्वास से संपादित किया जा सकता है।

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

इसे ध्यान में रखते हुए, मैं सुझाव दूंगा कि समाधान का एक हिस्सा मूल पाठ के भीतर ESCAPE CHARACTERS का उपयोग करने के दृष्टिकोण पर आधारित हो । यह आपकी स्वयं की मार्क-अप भाषा को डिजाइन करने या मौजूदा मार्कअप भाषा जैसे XML या HTML का उपयोग करने के समान नहीं है। एक ESCAPE CHARACTER डिजाइन करना आसान है जिसमें मूल पाठ में शून्य, या मौजूदा के शून्य अवसर के पास है।

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

उदाहरण से बचने के अनुक्रम के साथ डेटा

यह एक आदमी की कहानी है। >>>> (#) यह कहानी एक पुरुष की नहीं एक महिला की है? (#) ( उपयोगकर्ता ) :: 77367 ( ) प्रबंधक की टिप्पणी ( ) DataID :: 234234234 >>>> एक आदमी जो एक घास काटने गया था एक घास का मैदान mow करने के लिए चला गया। आदमी अपने कुत्ते के साथ गया >>>> (#) ग्राहक से पूछें कि क्या कहानी बिल्ली के साथ बेहतर होगी (#) >>>> घास काटने के लिए घास काटना। तो अब यह एक आदमी और उसके कुत्ते की कहानी है जो एक घास के मैदान में घास काटने गए थे।

एक आदमी और उसका कुत्ता, एक घास का मैदान घास काटने के लिए गए, एक घास का मैदान घास काटने गए, एक घास का मैदान पहाड़ पर पहुँच गया। >>>> (#) यह एक जंगल (**) सुझाव नोट (#) >>>> के साथ बेहतर लगता है

आदमी और उसका कुत्ता और उसका मिशन, घास काटने के लिए, एक घास का मैदान, जो नदी पार करते समय ही पहाड़ पर पहुँचता है।

उदाहरण के अनुक्रम से बचने के बिना डेटा

यह एक आदमी की कहानी है। एक आदमी जो घास काटने के लिए घास काटने गया था, वह घास काटने गया। आदमी घास काटने के लिए अपने कुत्ते के साथ गया था। तो अब यह एक आदमी और उसके कुत्ते की कहानी है जो एक घास के मैदान में घास काटने गया था।

एक आदमी और उसका कुत्ता, एक घास का मैदान घास काटने के लिए गए, एक घास का मैदान घास काटने गए, एक घास का मैदान पहाड़ पर पहुँच गया।

आदमी और उसका कुत्ता और उसका मिशन, घास काटने के लिए, एक घास का मैदान, जो नदी पार करते समय ही पहाड़ पर पहुँचता है।

जाहिर है कि यह आसानी से पार्स है, संपूर्ण मार्क-अप भाषा के रूप में जटिल नहीं है और आसानी से आपके उद्देश्य के अनुकूल है।

फिर भी हल किया? खैर, मैं कहूंगा कि नहीं। हमारे समाधान में अभी भी कुछ छेद हैं। इस डेटा की अनुक्रमण और संरचित पहुंच खराब है। साथ ही, इस फ़ाइल (या कई फ़ाइलों) को एक ही समय में संपादित करना उचित नहीं होगा।

हम उस समस्या को कैसे हल कर सकते हैं?

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

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

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


1
हाय स्टीफन और प्रोग्रामर में आपका स्वागत है! जब मैं आपके उत्तर में उत्साह की सराहना करता हूं, तो मुझे इससे अप्रासंगिक टिप्पणी को हटाना होगा। हम व्यापक दर्शकों के लिए अधिक सुलभ होने के लिए उत्तर को संक्षिप्त, सटीक और बिंदु के रूप में पसंद करते हैं।
यानिस

सबसे पहले, मुझे यह कहना होगा कि मुझे उत्तर में उत्साह पसंद था, इस तरह की अच्छी प्रतिक्रिया सुनकर बहुत अच्छा लगा। उत्तर के लिए ही, मुझे कहना होगा कि मैं टैग खोलने और बंद करने के लिए एक ही वाक्यविन्यास के खिलाफ होऊंगा; और शायद, अपने सबसे हालिया अपडेट में ऊपर वर्णित एक्सएमएल समस्या से बचने के लिए, मैं निर्दिष्ट करूंगा कि क्या खोला जा रहा है और टैग में ही बंद किया जा रहा है; शायद ऐसा है >>>>>(#1) Lorem ipsum (#1)>>>>>>:। इसके अलावा, ऐसा लगता है कि समवर्ती टिप्पणियों में आपके दृष्टिकोण ने उन्हें एक निश्चित स्थिति में बांध दिया होगा, अगर ऑफ़सेट स्थानांतरित हो जाता है तो यह कैसे काम करेगा?
सन्यत्सत्व

इसके अलावा, आप एक सटीक बिंदु के बजाय ऑफ़सेट-रेंज पर टिप्पणी को बाध्य करने के तथ्य पर कैसे जाएंगे ? अंतिम लेकिन कम से कम नहीं: डेटा आबंटन तालिका और लेन-देन की अद्यतन कतार अद्भुत अवधारणा लगती है। मैंने विषयों के बारे में कुछ शोध किया था, लेकिन क्या आप इस बारे में थोड़ा विस्तार कर सकते हैं कि आप इस वास्तुकला समस्या में उन अवधारणाओं को कैसे लागू करेंगे?
सूर्यतत्त्व

1

यह एक विशिष्ट प्रकार का इंजीनियरिंग प्रश्न है जिसमें आपके सभी विकल्पों में अलग-अलग ट्रेडऑफ होते हैं, और जो सबसे अच्छा है वह इस बात पर निर्भर करता है कि आपके लिए क्या महत्वपूर्ण है। दुर्भाग्य से, आपने दृढ़ निश्चय करने के लिए पर्याप्त जानकारी नहीं दी है।

आप एक महत्वपूर्ण शब्दार्थ समस्या पर विचार करने के लिए भी प्रकट नहीं हुए हैं। मूल पाठ कहते हैं

मेरे दोस्त बॉब ने मुझे पाँच डॉलर दिए

कोई "बॉब" कहकर एक टिप्पणी जोड़ता है

बॉब एक ​​पूर्ण बेवकूफ है

फिर मूल पाठ को संपादित किया जाता है

जेन ने बॉब को पांच डॉलर दिए जो उन्होंने बाद में मुझे उधार दिए

आप पाठ मिलान एल्गोरिथ्म का उपयोग करके इस विशेष मामले के बारे में कुछ समझ बना सकते हैं जैसे कि एक अलग फ़ाइल दिखाने के लिए किसका उपयोग किया जाता है, लेकिन कैरेक्टर ऑफ़सेट मेटाडेटा को "जेन" में "जेन" से जोड़ने जा रहे हैं।

इससे भी बदतर अगर पाठ को संपादित किया जाता है

मेरे दोस्त स्टीव ने मुझे पाँच डॉलर दिए

आप यह पता लगाने का प्रबंधन कर सकते हैं कि मेटाडेटा को "स्टीव" से कैसे जोड़ा जाए, लेकिन यह कैसे पता चलेगा कि यह लागू होता है?

इसके अलावा, क्या आपने तय किया है कि क्या मेटाडेटा में ही मेटाडेटा हो सकता है? यह आपके कार्यान्वयन को बदल सकता है।

सिमेंटिक मुद्दों से परे, यह बहुत स्पष्ट नहीं है कि आप डेटा के साथ क्या कर रहे हैं। मैंने सोचा कि शायद मूल पाठ "प्रदूषित" किसी भी मार्कअप के साथ होना बहुत असुविधाजनक था, लेकिन तब आप इसमें आईडी मान रखने के साथ ओके की तरह थे। यदि मेटाडेटा पाठ में किसी बिंदु पर सम्मिलित होने के बजाय पाठ के एक भाग पर लागू होता है तो यह बहुत मायने नहीं रखता है ।

मेरा अनुमान है कि ज्यादातर उद्देश्यों के लिए चिह्नित पाठ को संग्रहीत करना आसान है, या, दूसरी पसंद, सभी एसक्यूएल पर जाना और एक नोड पदानुक्रम द्वारा प्रस्तुत पाठ और मार्कअप - मूल रूप से तालिका के रूप में एक डोम है। यदि आपका डेटा पदानुक्रमित है, तो XML का उपयोग करना आसान हो सकता है और मौजूदा पार्सर को मुफ्त में प्राप्त कर सकते हैं, बनाम अपना स्वयं का लेखन।

यह काफी संभव है कि कुछ काफी सरल समाधान है जो आपकी सटीक स्थिति के लिए पर्याप्त है, लेकिन मैं आपको यह नहीं बता सकता कि ऐसा क्या है क्योंकि यह वास्तव में सिर्फ उस चीज पर निर्भर करता है जो आप करने की कोशिश कर रहे हैं, विस्तार से।

मैं आपको दृढ़ता से सुझाव दूंगा कि आप जो भी रणनीति चुनते हैं, आप उसे जितना चाहें उतना कर सकते हैं, हालांकि यह करना काफी कठिन है अगर आपके कार्यान्वयन में से कई SQL प्रश्नों को देखने की आवश्यकता है।

खेद है कि उत्तर इतना बिखरा हुआ है और इसलिए यह "निर्भर करता है" से भरा हुआ है, लेकिन वास्तविक दुनिया के डिजाइन प्रश्न इस तरह हैं।


मैं समझता हूं, और मैं सटीक, सही, उत्तर की तलाश में नहीं हूं। लेकिन कार्यान्वयन के विचारों के लिए, ट्रेडऑफ़ का विश्लेषण, या शायद मैंने सोचा कि एक उत्तर था जो दूसरों की तुलना में बेहतर था और मैं अभी इसके बारे में नहीं सोच रहा था। इस सवाल का जवाब देने के लिए कि आप पोज देते हैं: नहीं, मेरे मामले में मेटाडेटा में कोई मेटाडेटा नहीं होगा।
सूर्यास्तत्त्व

बेहतर यह है कि आप क्या करने की कोशिश कर रहे हैं पर निर्भर करता है।
psr

आपको स्पष्ट चित्र देने के लिए मेरे प्रश्न से क्या अन्य विवरण याद आ रहे हैं?
सूर्यास्तत्त्व

इससे अधिक आप यथोचित व्याख्या कर सकते हैं। पाठ के एक सेक्शन बनाम एक सम्मिलन बिंदु के बारे में मेटाडेटा होना कितना महत्वपूर्ण है, डीबी में एक फ़ील्ड में टेक्स्ट को एक साथ रखना कितना महत्वपूर्ण है, कितनी बार प्रत्येक संपादित किया जाता है, सीधे एसक्यूएल बनाम पुलिंग में प्रश्नों का विश्लेषण कितना होगा। पाठ फिर बाद में विश्लेषण करना और प्रत्येक के साथ आपका आराम स्तर क्या है, यह किस पैमाने पर होता है, समय के साथ बदलने की संभावना क्या है, अगर आप मार्कअप के साथ जाते हैं तो क्या आप अपने खुद के साधारण पार्सर लिखने में सहज हैं या क्या आप XML के साथ बेहतर करेंगे, जो कम अनुकूलित है, लेकिन अधिक उपकरण हैं ...
Psr

यही कारण है कि मैं केवल दिशानिर्देश दे सकता हूं। विशेष रूप से उत्तर का अर्थ है कि संभवतः आप इसी तरह की स्थितियों में भी दूसरों की मदद कर सकते हैं।
Psr

0

मुझे लगता है कि पिछले उत्तर देने वाले का सुझाव, जिस पर आप सवाल करते हैं) वह बहुत अच्छा है।

यह उसी तरह से व्यवहार करेगा जैसे हम StackExchange साइटों पर लिंक पोस्ट करते हैं, लेकिन जानकारी डेटा किसी अन्य तालिका पर होगा। लाभ हैं, आपके पास डेटा अलग है, और इसलिए क्वेरी करने योग्य और अनुक्रमित है। पाठ को संपादित करने पर, आप हटाए गए मेटाडेटा आईडी की जांच कर सकते हैं और मेटाडेटा तालिका को साफ कर सकते हैं।

केवल एक छोटी सी समस्या है जैसे आपने कहा है, लेकिन आप इससे आसानी से निपट सकते हैं।


पिछला जवाब क्या? प्रस्तुत किए गए उत्तरों का क्रम किसी भी क्रम में होने की गारंटी नहीं है - या उस मामले के लिए, उत्तर को आपके कम उपयोगी बनाने के लिए मौलिक रूप से बदला या हटाया जा सकता है। क्या आप अपने प्रश्न को ऐसे संशोधित कर सकते हैं कि उसे किसी अन्य उत्तर को संदर्भित करने की आवश्यकता नहीं है?

मेरा मतलब है, प्रश्न में ओपी द्वारा पिछला उत्तर उल्लेख
RMalke

0

आइए हम एक पाठ कहते हैं:

लॉरेम इप्सम डोलर अमेट, कंसेटेटुर एडिपिसिंग एलीट, सेड डायम नोनमी निब युरिस्मोड टिंसीडंट उर लोरेटेट डोलोर मैग्ना अलिकम एरट वुल्लेट।

मैं इस तरह से नोट जोड़ता हूं:

लोरम इप्सम डोलर अमेट, कंसेटेटुर एडिपिसिंग एलीट, सेड डायम [@ 123, # 456,2w] नॉनमी निब युरिस्मोड टिंसीडंट उर लोरेट डोलोर मैग्ना क्युकम इरट वुल्लेट।

[@123,#456,2w]का अर्थ है: user_id = 123, note_id = 456, और इस नोट द्वारा चिह्नित पाठ अगले 2 शब्दों के लिए फैला हुआ है (चार्ट्स ( c), वाक्य s), पैराग्रैप्स ( p) या जो भी हो। सटीक वाक्यविन्यास अलग हो सकता है, निश्चित रूप से।

सादे पाठ संपादकों में नोट्स के पाठ को मार्कडाउन फुटनोट्स की तरह ही दस्तावेज़ के अंत में आसानी से संग्रहीत किया जा सकता है।

समृद्ध पाठ संपादकों में इस तरह के नोट को आइकन के रूप में पाठ में प्रदर्शित किया जा सकता है, और चिह्नित पाठ को किसी तरह से हाइलाइट किया जा सकता है। उपयोगकर्ता फिर ऐसे नोटों को सामान्य वर्णों के साथ हटा सकता है , Delया Backspaceउन्हें किसी विशेष संपादन मोड के साथ संपादित कर सकता है। मुझे लगता है कि पॉपअप विंडो के साथ माउस और संपादन नोट पाठ के साथ विख्यात क्षेत्रों का आकार बदलना है।

पेशेवरों:

  • "चौराहों" के साथ अच्छी तरह से चला जाता है क्योंकि आप एक ऑफसेट को चिह्नित करते हैं (पाठ में नोट की स्थिति से स्पष्ट रूप से) और प्रत्येक नोट के लिए एक लंबाई।
  • बहुउपयोगी वातावरण का समर्थन करता है। (वास्तव में, इसके लिए कुछ गहन शोध की आवश्यकता है और आपको शायद Google वेव ऑपरेशनल ट्रांसफ़ॉर्मेशन जैसी किसी चीज़ से निपटना होगा , जिसे मेरा मस्तिष्क नहीं संभाल सकता है।)
  • अमीर और सादे दोनों पाठ संपादकों के साथ संपादित किया जा सकता है।
  • आप आसानी से संशोधन को संभाल सकते हैं, क्योंकि सभी मार्कर जगह में हैं - जब आप किसी मार्कर से पहले पाठ को संपादित करते हैं, तो मार्कर अन्य पाठ के साथ ही बदलता है।
  • पार्स करने में आसान।
  • बाहरी डीबी की कोई आवश्यकता नहीं है, लेकिन आप अभी भी एक का उपयोग कर सकते हैं यदि आप चाहते हैं।
  • यदि आप कुछ विनीत सिंटैक्स चुनते हैं तो मार्कडाउन या एक्सएमएल के साथ मिलाया जा सकता है।

सादे पाठ संपादन के लिए विपक्ष:

  • आप नोटों से चिह्नित पाठ में क्षेत्रों को नहीं देख सकते हैं (जब तक कि आप प्लेनटेक्स्ट को उजागर नहीं करते हैं, जो एक विकल्प भी है), लेकिन सिर्फ उन स्थानों पर जहां नोट शुरू होते हैं। यह मनमाना लंबाई इकाइयों को चुनने की क्षमता द्वारा मुआवजा दिया जाता है: वर्ण, शब्द, वाक्य, पैराग्राफ।
  • आप नोटिंग के तहत टेक्स्ट को बिना किसी सूचना के संपादित कर सकते हैं, खासकर अगर कोई नोट काफी लंबा फैला हो (जैसे 2+ पैराग्राफ)। रीविज़न कंट्रोल मैकेनिज़म द्वारा इसकी भरपाई की जा सकती है, जो कि पिछले नोट के साथ प्रत्येक नोट के टेक्स्ट की तुलना करता है और यदि इसे बदला गया हो तो उपयोगकर्ता को सूचित करता है।

सामान्य सहमति:

  • एक ही पाठ को संपादित करने वाले कई उपयोगकर्ताओं के साथ समस्याएँ हैं, लेकिन मुझे लगता है कि यह वैसे भी अपरिहार्य है। मैं इस क्षेत्र का विशेषज्ञ नहीं हूं।

आपकी राय में क्लोजर टैग नहीं जोड़ने पर ऑफसेट के साथ काम करने की क्या संभावना है? क्या यह बहुत जोखिम भरा नहीं है? अगर मैं बीच में एक शब्द nonummyऔर जोड़ nibhदूं, तो क्या यह मेरे वंश के साथ खिलवाड़ नहीं करेगा?
सूर्यात्सत्व

हां, यह एक ऑफसेट के साथ गड़बड़ कर सकता है और उस मुद्दे को "वर्चुअल" एंड-ऑफ-नोट मार्कर के साथ एक अमीर टेक्स्ट एडिटर में हल किया जा सकता है, जो बिल्कुल स्टार्ट मार्कर की तरह काम करता है, सिवाय इसके कि इसे स्पष्ट रूप से संपादित नहीं किया जा सकता है (यह सिर्फ इसे चिह्नित करने के लिए है एंड-ऑफ-नोट, संपादित पाठ के साथ स्थानांतरण) और यह पाठ के साथ सहेजा नहीं गया है। आप इसे संपादित करते समय डालें और फिर सहेजते समय इसे छोड़ दें। आम तौर पर, मुझे लगता है कि शुरुआत और अंत दोनों मार्करों के साथ और भी अधिक समस्याएं हो सकती हैं, फिर उनमें से केवल एक के साथ, लेकिन निश्चित रूप से मैं गलत हो सकता हूं।
स्क्रिप्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.