2013-03-15 5 views
14

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

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

विकल्प 1: जोड़े फ़ाइल संदर्भ पहले

//Adds a reference to a file in the database 
database.AddFileRef("newfile.txt"); 

//Stores the file in the file system 
fileStorage.SaveFile("newfile.txt",dataStream); 

क्योंकि फाइल करने के लिए संदर्भ वास्तविक फ़ाइल पहले जोड़ा जाता है, तो किसी अन्य उपयोगकर्ता से पहले एक फ़ाइल डाउनलोड करने की कोशिश कर रहा हो सकती यह विकल्प समस्याग्रस्त किया जाएगा यह वास्तव में सिस्टम में संग्रहीत है। हालांकि, फ़ाइल के संदर्भ को हाथ से पहले बनाया गया है, इसलिए फाइल को संग्रहीत करते समय प्राथमिक कुंजी मान का उपयोग किया जा सकता है।

विकल्प 2: दुकान फ़ाइल पहले

//Stores the file 
fileStorage.SaveFile("newfile.txt",dataStream); 

//Adds a reference to the file in the database 
//fails if reference file does not existing in file system 
database.AddFileRef("newfile.txt"); 

यह विकल्प बेहतर है, लेकिन किसी प्रणाली है कि संदर्भित कभी नहीं करने के लिए एक फ़ाइल अपलोड करने के लिए यह संभव होगा। यद्यपि इसका उपयोग "Purge" या "CleanUpFileSystem" फ़ंक्शन से किया जा सकता है जो किसी भी संदर्भित फ़ाइलों को हटा देता है। यह विकल्प डेटाबेस से प्राथमिक कुंजी मान का उपयोग करके फ़ाइल को संग्रहीत करने की अनुमति नहीं देगा।

विकल्प 3: लंबित स्थिति

//Adds a pending file reference to database 
//pending files would be ignored by others 
database.AddFileRef("newfile.txt"); 

//Stores the file, fails if there is no 
//matching pending file reference in the database 
fileStorage.SaveFile("newfile.txt",dataStream); database 

//marks the file reference as committed after file is uploaded 
database.CommitFileRef("newfile.txt"); 

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

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

+1

बहुत बुद्धिमान सवाल:

Python शब्दावली में

। कई लोग अपने अलग-अलग डेटा स्टोर्स के बीच स्थिरता के बारे में कभी नहीं सोचते हैं। – usr

उत्तर

2

मैं एक और विकल्प प्रस्तावित करना चाहता हूं। फ़ाइल नाम हमेशा इसकी सामग्री के हैश के बराबर बनाओ। फिर आप किसी भी सामग्री को पर सुरक्षित रूप से लिख सकते हैं बशर्ते कि आप इसे कहीं और संदर्भ जोड़ने से पहले ऐसा करते हैं।

सामग्री कभी नहीं बदलेगी, सिंक्रनाइज़ेशन समस्या कभी नहीं होती है।

यह आपको मुफ्त में समर्पण देता है। हालांकि हटावट मुश्किल हो जाती है। मैं एक रात कचरा संग्रह प्रक्रिया की सलाह देते हैं।

+0

क्या आप विस्तृत कर सकते हैं? मुझे फ़ाइल से हैश कोड मिलेगा, और यह निर्धारित करने के लिए उस कोड का उपयोग करें कि फ़ाइल सिस्टम में फ़ाइल कैसे संग्रहीत की जाती है? फिर डेटाबेस को संदर्भ के रूप में फ़ाइल को हैश कोड के रूप में संग्रहीत करते समय फ़ाइल नाम? तो मुझे टकराव की संभावना से निपटना नहीं होगा? –

+1

यदि आप एक मानक क्रिप्टोग्राफिक हैश फ़ंक्शन का उपयोग करते हैं तो आपको टकराव से निपटने की ज़रूरत नहीं है (यदि आपने पहले लॉटरी 10 बार पहले जीता होगा)। पुराना एमडी 5 एल्गोरिदम काफी अच्छा है, हर जगह बनाया गया है और सबसे तेज़ एल्गोरिदम में से एक है .; आप पहले हैश निर्धारित करेंगे, फिर उस से फ़ाइल नाम प्राप्त करें ('tohex (हैशबाइट्स) +" .dat "') और इसे लिखें। फिर आप डेटाबेस में हैश (या फ़ाइल नाम) स्टोर करते हैं। किया हुआ। – usr

0

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

यदि आप आश्वस्त हैं कि आपको इसकी आवश्यकता है, तो विकल्प 1 और 2 तकनीकी दृष्टि से पूरी तरह से समान हैं - 2 संसाधन सिंक से बाहर हो सकते हैं और आपको उन्हें फिर से समेकित करने के लिए नियमित प्रक्रिया की आवश्यकता है। तो यहां आपको उन विकल्पों को चुनना चाहिए जो एप्लिकेशन को सर्वोत्तम रूप से उपयुक्त बनाती हैं।

विकल्प 3 का कोई फायदा नहीं है, लेकिन अधिक संसाधनों का उपयोग करता है।

ध्यान दें कि यूएसआर द्वारा सुझाए गए हैंश का उपयोग करके टकराव का सैद्धांतिक जोखिम होता है। और आपको विकल्प 1 और 2.

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

+1

डेटाबेस में संग्रहीत अन्य गैर-बाइनरी जानकारी है जो फ़ाइलों को जारी की जाती है, इसलिए हाँ मुझे इसकी आवश्यकता है। –

0

दोष यह आप विकल्प 1 मैं fileStorage.FileExists("newfile.txt"); की तरह कुछ का उपयोग करें और परिणाम है जिसके लिए यह एक नकारात्मक रिटर्न को फ़िल्टर का उल्लेख किया ठीक करने के लिए।

import os 
op = os.path 

filter(lambda ref: op.exists(ref.path()), database.AllRefs()) 
संबंधित मुद्दे