2009-11-08 21 views
5

मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जो बड़ी संख्या में रिकॉर्ड स्टोर करेगा। ये रिकॉर्ड कुछ (यूआरएल, दिनांक, शीर्षक, स्रोत, {वैकल्पिक डेटा ...})रिकॉर्ड को संग्रहीत करने के लिए मुझे किस डेटाबेस का उपयोग करना चाहिए, और मुझे इसका उपयोग कैसे करना चाहिए?

चूंकि यह क्लाइंट-साइड ऐप है, मैं डेटाबेस सर्वर का उपयोग नहीं करना चाहता, मैं बस चाहता हूं फाइलों में संग्रहीत जानकारी।

मैं चाहता हूं कि फाइलें विभिन्न भाषाओं (कम से कम पायथन और सी ++) से पठनीय हों, इसलिए पाइथन के अचार जैसी कुछ भाषा खेल से बाहर है।

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

क्या मेरा तर्क सही है? यदि हां, तो मुझे अपने रिकॉर्ड स्टोर करने के लिए बीडीबी का उपयोग कैसे करना चाहिए? क्या आप मुझे प्रासंगिक जानकारी से जोड़ सकते हैं? या क्या मुझे बेहतर समाधान याद आ रहा है?

+0

आपके सभी उपयोगी उत्तरों के लिए आप सभी को धन्यवाद! सबसे अच्छा चुनना वास्तव में मुश्किल था: -/ –

उत्तर

5

मुझे दो संभावनाएं दिखाई दे रही हैं: sqlite और बर्कलेडीबी। अपने प्रयोग के मामले स्पष्ट रूप से संबंधित नहीं है के रूप में, मैं BerkeleyDB के साथ जाने के लिए परीक्षा रहा हूँ , हालांकि मैं वास्तव में नहीं जानता कि मैं इसे कैसे के रूप में मेरे रिकॉर्ड, दुकान के लिए इसका इस्तेमाल करना चाहिए केवल भंडार कुंजी/मान जोड़े।

जो आप वर्णन कर रहे हैं वह वास्तव में क्या है, भले ही आपको केवल एक तालिका की आवश्यकता हो। SQLite शायद यह करना बहुत आसान होगा।

संपादित करें: संबंधपरक मॉडल के पास तालिकाओं के बीच संबंधों के साथ कुछ भी नहीं है। एक संबंध अन्य सेटों के कार्टेशियन उत्पाद का सबसेट है। उदाहरण के लिए, वास्तविक संख्याओं, वास्तविक संख्याओं और वास्तविक संख्याओं का कार्टेशियन उत्पाद (हां, सभी तीन वही) 3 डी समन्वय स्थान उत्पन्न करते हैं, और आप उस स्थान पर एक सूत्र के साथ एक संबंध परिभाषित कर सकते हैं, x*y = z कहें। निर्देशांक के प्रत्येक संभावित सेट (x0,y0,z0) या तो संबंध में हैं यदि वे दिए गए सूत्र को संतुष्ट करते हैं, अन्यथा वे नहीं हैं।

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

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

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


इस बिंदु घर ड्राइव करने के लिए, कि एक संबंधपरक डेटाबेस में अच्छी तरह से काम करता है यहां तक ​​कि जब तुम सिर्फ एक से अधिक तालिका की जरूरत नहीं है, तो निम्न (मूल नहीं) पर विचार

SELECT t1.actor1 
FROM workswith AS t1, 
    workswith AS t2, 
    workswith AS t3, 
    workswith AS t4, 
    workswith AS t5, 
    workswith AS t6 
WHERE t1.actor2 = t2.actor1 AND 
     t2.actor2 = t3.actor1 AND 
     t3.actor2 = t4.actor1 AND 
     t4.actor2 = t5.actor1 AND 
     t5.actor2 = t6.actor1 AND 
     t6.actor2 = "Kevin Bacon"; 

कौन सा, स्पष्ट रूप से उपयोग करता है एक एकल तालिका: workswith प्रत्येक अभिनेता की गणना 6

+0

क्या आप विस्तारित कर सकते हैं? मेरे लिए रिलेशनल केवल वास्तव में समझ में आता है यदि आपके बीच संबंधों के साथ कई तालिकाओं हैं ... –

1

MongoDB के बारे में क्या? मैंने अभी तक कोशिश नहीं की है, लेकिन यह दिलचस्प लगता है।

+0

दिलचस्प लग रहा है ... हालांकि, वास्तव में परिपक्व प्रतीत नहीं होता है। –

2

बर्कलेडीबी अच्छा है, * डीबीएम अवतार (उदा। जीडीबीएम) पर भी देखें। हालांकि बड़ा सवाल यह है कि आपको क्या खोजना है? क्या आपको उस URL द्वारा URL की एक श्रृंखला या आपके द्वारा सूचीबद्ध तिथियों की खोज करने की आवश्यकता है?

स्थानीय फाइल सिस्टम में रिकॉर्ड्स के समूहों को रिकॉर्ड करने के लिए भी संभव है, जो दिनांक या खोज शब्द, & सी द्वारा समूहित हैं।

"खोज" प्रश्न का उत्तर सबसे बड़ी शुरुआत है।

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

+0

"आप किसी कुंजी/मूल्य स्टोर में लगभग कुछ भी मॉडल कर सकते हैं।" क्या आप इस पर पढ़ने के लिए कुछ सुझा सकते हैं? मैं देख सकता हूं कि यह मॉडल बहुत सामान्य है, लेकिन कुछ उदाहरण पढ़ना उपयोगी होगा। –

+1

मैं देख सकता हूं कि मुझे क्या मिल सकता है, लेकिन अंतर्निहित डीबी स्टोर की पारंपरिक मूल बातें प्रभावी रूप से कुछ तंत्र या किसी अन्य में एक महत्वपूर्ण/मूल्य स्टोर होती हैं। एक ढेर तालिका पंक्तियों के साथ एक कुंजी/मान में लिखी गई पंक्तियों के रूप में लिखा जाता है और मूल्य के रूप में उत्पन्न एक पंक्ति के रूप में कुंजी होती है। ऐसी तालिका पर एक गैर-कंपाउंड इंडेक्स इंडेक्स के मानों को कुंजी के रूप में कुंजी और ROWID के रूप में सूचीबद्ध करता है। निश्चित रूप से यह उससे अधिक जटिल हो जाता है लेकिन * किसी अन्य स्तर के संकेत के बिना हल नहीं किया जा सकता * यहां लागू होता है। अगर मैं कुछ लेख पा सकता हूं तो मैं वापस टिप्पणी करूंगा। – Xailor

2

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

दूसरी ओर, मैं Berkely डीबी के बारे में अजगर देव की सूची है कि सुझाव है कि यह अद्भुत से कम पर विभिन्न टिप्पणियों को देखा है; आपको केवल ताना-शैली का उपयोग मिलता है (यदि आप URL की बजाय कुछ दिनांक सीमाएं या शीर्षक चुनना चाहते हैं); और यह पाइथन 3 के पुस्तकालयों के मानक सेट में भी नहीं है।

+0

"यह पाइथन 3 के पुस्तकालयों के मानक सेट में भी नहीं है।" यह नहीं पता था, यह एक बहुत अच्छा मुद्दा है, धन्यवाद! –

+0

कृपया जांचें। मैंने एक नज़र डाली और मैं देख सकता हूं (जी | एन) डीबीएम समर्थन, लेकिन मुझे लगता है कि यह अलग है, है ना? शायद देव सूची में मुझे जो चर्चा याद है वह इसे छोड़ने से संबंधित थी। –

1

यदि आप रिकॉर्ड देखने के लिए केवल एक फ़ील्ड का उपयोग करने जा रहे हैं, तो एक साधारण कुंजी-मूल्य स्टोर एक अच्छा विकल्प होगा। अपनी कुंजी के रूप में उस एकल फ़ील्ड (या कोई अन्य अद्वितीय आईडी) को स्टोर करें, प्रत्येक रिकॉर्ड को एक स्ट्रिंग के रूप में क्रमबद्ध करें (जेएसओएन या इसी तरह का उपयोग करके), और उस स्ट्रिंग को मान के रूप में स्टोर करें। बर्कले DB निश्चित रूप से एक कुंजी-मान की दुकान के लिए एक उचित विकल्प है, लेकिन वहाँ कई विकल्पों में से चुनने के लिए कर रहे हैं: http://en.wikipedia.org/wiki/Dbm

आप कई क्षेत्रों में से किसी से रिकॉर्ड देखने चाहते हैं, SQLite विकास प्रयोजनों के लिए सबसे आसान हो सकता है। आप एसक्यूएल में प्रश्न लिखेंगे लेकिन आपको डेटाबेस सर्वर को बनाए रखना नहीं होगा। सभी बहु-कुंजी मशीनरी पहले से ही आपके लिए लिखी गई हैं।

तुम सच में एसक्यूएल से बचने या अपने डेटा स्टोर, और आप बहु कुंजी पहुँच चाहते से बाहर प्रदर्शन के हर बिट निचोड़ चाहते हैं, कोई मुख्य-मान की दुकान के ऊपर अतिरिक्त तर्क की एक परत पर विचार करें। अपने रिकॉर्ड को क्रमबद्ध करके और प्रत्येक रिकॉर्ड के "कॉलम" मानों को अतिरिक्त कुंजी के रूप में डालने के द्वारा कुंजी-मूल्य स्टोर के शीर्ष पर कॉलम-जैसे व्यवहार बनाना संभव है जिनके मानों में आपके रिकॉर्ड की "प्राथमिक" कुंजी होती है। (आप उन रिकॉर्ड्स को खोजने के लिए रिकॉर्ड के शब्दकोश और इंडेक्स के शब्दकोश दोनों के रूप में प्रभावी रूप से कुंजी-मूल्य स्टोर का उपयोग कर रहे हैं।) Google का ऐप इंजन ऐसा कुछ करता है। आप इसे स्वयं कर सकते हैं या विभिन्न दस्तावेज़-उन्मुख डेटाबेसों में से एक का उपयोग कर सकते हैं जो आपके लिए यह करेगा। कुछ रोचक पढ़ने के लिए, "nosql" googling का प्रयास करें। http://www.google.com/search?&q=nosql

+1

पीएस पाइथन वितरण में बर्कले डीबी के साथ सौदा यह है कि बीडीबी लाइब्रेरी इंटर्नल पाइथन देवों की तुलना में अधिक बार बदल रहे थे। ऐसा नहीं है कि बेरेकेली डीबी खराब था, सीधे पाइथन रिलीज में एकीकृत करने के लिए असुविधाजनक। आप अभी भी एक अलग मॉड्यूल के रूप में बीडीबी पायथन बाइंडिंग प्राप्त कर सकते हैं। –

0

ठीक है, तो आप बस डेटा संग्रहित करते हैं ..? आपको वास्तव में पुनर्प्राप्ति, लुकअप, संक्षेप आदि के लिए केवल डीबी की आवश्यकता है। इसलिए, भंडारण के लिए, बस साधारण टेक्स्ट फ़ाइलों का उपयोग करें और लाइनों को संलग्न करें। यदि आपको आवश्यकता हो तो डेटा को संपीड़ित करें, फ़ील्ड के बीच delims का उपयोग करें - बस किसी भी भाषा के बारे में ऐसी फाइलें पढ़ने में सक्षम होंगे। यदि आप पुनर्प्राप्त करना चाहते हैं, तो अपनी पुनर्प्राप्ति आवश्यकताओं, तिथि, कुंजी, कुंजी, इत्यादि पर ध्यान केंद्रित करें। यदि आप साधारण ग्राहक पक्ष चाहते हैं, तो आपको सरल क्लाइंट डीबी की आवश्यकता है। एसक्यूएलएट बीडीबी की तुलना में कहीं अधिक आसान है, लेकिन साइबेस एडवांटेज (स्थानीय ग्राहकों के लिए बहुत तेज़ और मुफ्त लेकिन ओपन-सोर्स नहीं) या VistaDB या फ़ायरबर्ड जैसी चीजों को देखें ... लेकिन सभी को स्थानीय कॉन्फ़िगरेशन/सेटअप/रखरखाव की आवश्यकता होगी। यदि आप रिकॉर्ड्स की 'बड़ी' संख्या के लिए स्थानीय एक्सएमएल जाते हैं तो आपको कुछ अनावश्यक रूप से फूला हुआ फ़ाइल आकार मिलेगा ..!

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