2009-03-19 12 views
36

यह एक प्रश्न है जो पहले से पूछा गया है (large-text-and-images-in-sql) लेकिन मुख्य रूप से डेटा के लिए जो बदलेगा। मेरे मामले में डेटा संग्रहीत किया जाएगा और कभी नहीं बदला जाएगा। सब कुछ एक साथ रखने के लिए बस समझदार लगता है।क्या आप डेटाबेस में या फ़ाइल सिस्टम में बाइनरी डेटा स्टोर करेंगे?

क्या कोई कारण है कि मुझे डेटाबेस में स्थिर बाइनरी डेटा स्टोर नहीं करना चाहिए?

मान लीजिए कि यह एक समझदार बात है, क्या अलग-अलग तालिकाओं में ऐसे डेटा को संग्रहीत करने के कोई फायदे हैं? (अब आप महसूस कर सकते हैं कि मैं डीबी विशेषज्ञ नहीं हूं ...)

स्पष्ट करें: शायद 10-20 से अधिक उपयोगकर्ता नहीं होंगे लेकिन ये अमेरिका और ब्रिटेन में होंगे। द्विआधारी डेटा किसी भी मामले में स्थानांतरित किया जाना होगा।

उत्तर

32

डीबी में डेटा संग्रहीत करने का लाभ डीबी सुरक्षा तंत्र का लाभ ले रहा है और रखरखाव लागत को कम करना (बैकअप, ...)। इसका नुकसान डीबी लोड और उपभोग कनेक्शन बढ़ रहा है (जो प्रति कनेक्शन लाइसेंस प्राप्त डेटाबेस सर्वर के लिए महंगा हो सकता है)। यदि आप SQL Server 2008 का उपयोग कर रहे हैं, FILESTREAM एक अच्छा विकल्प हो सकता है।

वैसे, वेब ऐप्स (या डेटा को स्ट्रीम करने की आवश्यकता हो सकती है) के लिए, आमतौर पर डीबी के बाहर डेटा स्टोर करने के लिए अधिक समझदार होता है।

+2

मुझे यकीन नहीं है कि यह रखरखाव/बैकअप लागत को कैसे कम करता है। यदि कुछ भी उन्हें बढ़ाता है क्योंकि आमतौर पर डेटाबेस का बैक अप लेना अधिक महंगा होता है और फाइल सिस्टम का बैक अप लेने की अपेक्षा करता है। क्या आप विस्तार से समझा सकते हैं? – jrwren

+3

@jrwren मेरा मुद्दा यह है कि आपको डेटाबेस बैकअप में निहित डेटा के साथ अखंडता सुनिश्चित करने के लिए अलग-अलग बैकअप फ़ाइलों की आवश्यकता नहीं है और मैन्युअल रूप से उन्हें समन्वयित रखने की आवश्यकता नहीं है। यह * परिस्थितियों के आधार पर * अधिक सरल और सस्ता एक रास्ता या दूसरा हो सकता है। –

8

यदि आप ब्लॉबर्स संग्रहीत कर रहे हैं तो सबसे बड़ा नुकसान स्मृति खपत है। क्या आप कल्पना कर सकते हैं कि एक्स से * प्रत्येक में 45k छवि के साथ हजारों रिकॉर्ड के लिए क्या होगा?

जैसा कि मेहदाद ने कहा कि फायदे भी हैं। इसलिए यदि आप उस दृष्टिकोण के साथ जाने का निर्णय लेते हैं तो आपको अपने डेटाबेस को डिज़ाइन करने का प्रयास करना चाहिए ताकि अधिकांश प्रश्न उन में बीएलओबी डेटा के साथ कम परिणाम लौटा सकें। शायद उदाहरण के लिए इस उद्देश्य के लिए एक से एक रिश्ते बनाओ।

+0

+1 अच्छा बिंदु - शायद अलग मेज में ब्लब्स डालने और आईडी के माध्यम से लेने का एक अच्छा कारण है? – paul

+0

ईमानदार होने के लिए मैं हमेशा बीएलओबी का उपयोग करने से डरता हूं, क्योंकि मैं एसक्यूएल पर चूसता हूं। लेकिन अगर मुझे लगता है कि मैं शायद प्रत्येक ब्लॉब के लिए एक अलग-अलग संबंध बनाउंगा। जब मैं फ़ाइलों के संदर्भों का उपयोग करता हूं तो इसका बहुत अधिक उपयोग होता है। इन्हें डीबी में संग्रहीत किया जाएगा। नोट: कृपया वेबपैस में ऐसा न करें। – Vasil

+7

आईएमएचओ, यह एक वैध तर्क नहीं है। 'एक्स * से एक्स * का चयन करना अधिकांश परिस्थितियों में एक बुरा विचार है, सिवाय इसके कि आपको अपने ऐप में किसी तालिका के * हर * कॉलम का उपयोग करने की आवश्यकता है। एक अलग मेज में ब्लब्स डालना और भी बदतर है, क्योंकि इसमें शामिल होने और अनुरोधों को जटिल करने की आवश्यकता होगी। –

1

क्या यह वही नहीं है जो LOBs या CLOBs या .... डिज़ाइन किए गए थे?

हमने सीएलओबी का उपयोग एक प्रमुख एयरलाइन सिस्टम के लिए क्रेडिट कार्ड कार्ड लेनदेन के बड़े एन्क्रिप्शन स्टोर करने के लिए किया था।

मेमोरी खपत हालांकि आपका सबसे बड़ा अपराधी है।

HTH

चियर्स,

5

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

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

मुझे नहीं लगता कि लोगों को पहले स्थान पर select * प्रश्नों का उपयोग करना चाहिए। आप जो करते हैं वह डेटा प्राप्त करने के दो तरीके प्रदान करता है, एक विधि सारांश जानकारी देता है, दूसरा ब्लॉब वापस कर देगा। मैं कल्पना नहीं कर सकता कि आपको एक बार में हजारों छवियों को वापस क्यों लौटना होगा।

+0

+1। भाग से * चयन के बारे में। आपको जरूरी नहीं है कि उस प्रश्न को हाथ से लिखना पड़े। कुछ ओआरएम डिफ़ॉल्ट रूप से इस प्रकार के प्रश्नों का उपयोग करते हैं, इसलिए यदि कोई सावधान नहीं है ... आउच। – Vasil

+0

हे, आप जानते हैं कि कौन सी ओआरएम उन प्रश्नों का उपयोग करता है? मैं उनसे दूर रहना चाहता हूं। nHibernate मुझे पता है – JoshBerke

+0

मैंने कुछ php ढांचे में देखा है, याद नहीं कर सकता। लेकिन चूंकि वे एक वेब ऐप में हैं, इसलिए शायद उन्होंने सोचा था कि चुनिंदा foo, bar, सॉसेज से तार पर कम डेटा है। मुझे यकीन है कि उन्होंने कभी भी ब्लॉग्स के बारे में सोचा नहीं। – Vasil

1

कुछ डेटाबेस (उदा। Postgresql) स्वचालित रूप से क्षेत्रों सेक, शायद यह तेजी से जब उन्हें सीधे पढ़ने डाटाबेस से है।और यह भी, कार्यक्रम सभी क्षेत्रों और छवि को एक झुकाव में पढ़ सकता है।

+1

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

+3

कई ब्लब्स (छवियों, एमपी 3, इत्यादि) वैसे भी अनिवार्य रूप से precompressed हैं। – dkretz

2

हम अपने सिस्टम में अनुलग्नक स्टोर करते हैं, और आप एक अनुलग्नक नहीं बदल सकते हैं, इसलिए मुझे लगता है कि हम एक ही पृष्ठ w/डेटा पर हैं जो "संग्रहीत और कभी नहीं बदला जाएगा।" हमने डेटाबेस में स्टोर करने के लिए विशेष रूप से का निर्णय लिया है। हमने इसे दो कारणों, सादगी, और बैकअप/वसूली के समय के लिए किया था।

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

बैकअप/पुनर्प्राप्ति पक्ष पर: ये ब्लब्स संभवतः आपके डेटाबेस के सबसे बड़े टुकड़ों में से एक बन जाएगा। जब भी आप एक पूर्ण बैकअप चलाते हैं तो आप इन बिट्स को बार-बार कॉपी करेंगे, भले ही आप जानते हों तो कभी नहीं बदल सकते हैं। हमारे लिए यह बहुत अधिक सरल (बहुत) छोटे बैकअप के लिए लग रहा था, और बैकअप के रूप में द्वितीयक सर्वर पर अनुलग्नक निर्देशिका का xcopy करें।

1

ऊपर दिए गए पते के रूप में प्रदर्शन समस्या यहां है, इसलिए मैं इसे दोहराना नहीं चाहूंगा। लेकिन मुझे लगता है कि यदि आप चीजों को संग्रहित कर रहे हैं तो एक अच्छी युक्ति है (जैसे वेब साइट पर छवियों/दस्तावेजों) को कैशिंग सिस्टम में बनाना है।

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

4

मैं एक काफी अच्छे आकार ओएसएस परियोजना है कि अपनी स्थापना के समय निर्णय MySQL डेटाबेस में छवियों को स्टोर करने के लिए बनाया से परिचित हूँ, और सर्वोच्च 3 बुरा विचारों वे जब से के साथ मुकाबला करने की है, के बीच साबित हो रहा है। (वास्तव "refactor निर्दयता" अभिशाप है ने और बढ़ा दिया है, लेकिन यह एक और कहानी है।)

गंभीर समस्याओं का कारण है इस के अलावा

:

  1. अधिकतम कुशल डेटाबेस आकार (mysql) से अधिक। (छवियों के लिए आवश्यक कुल स्थान अन्य सभी को परिमाण के कम से कम 2 ऑर्डर से अधिक करता है)।

  2. छवि फ़ाइलों को उनकी "सुंदरता" खो देते हैं। कोई दिनांक आकार इत्यादि नहीं। जब तक कि तारीखों के रूप में संग्रहीत (अनावश्यक रूप से) (जिसके लिए प्रबंधन के लिए कोड की आवश्यकता होती है)।

  3. मनमाने ढंग से बाइट अनुक्रम भंडारण या हेरफेर के लिए हर समय अच्छी तरह से संसाधित नहीं करते हैं।

  4. "हमें कभी भी छवियों को बाहरी रूप से एक्सेस करने की आवश्यकता नहीं होगी" एक खतरनाक धारणा है।

  5. फ्रैगिलिटी। क्योंकि पूरी व्यवस्था अप्राकृतिक और स्पर्शपूर्ण है, और आप नहीं जानते कि यह कहां काट देगा (एंटी-रिफैक्टर मानसिकता में योगदान)।

लाभ? कोई भी जिसे मैं सोच सकता हूं, सिवाय इसके कि उस समय कम से कम प्रतिरोध का मार्ग हो सकता है।

+0

मुझे लगता है कि ब्लब्स स्टोर करना बुरा निर्णय था। सही बात? – paul

+0

सही - स्पष्ट। – dkretz

+1

एक बड़ा लाभ डेटा की स्थिरता है: उचित कुंजी के साथ "फाइल" मेटा डेटा के बिना हटाया जा सकता है और इसके विपरीत। डिस्क फ़ाइलों के लिए ऐसी कोई बाधा नहीं है और फ़ाइलों को जोड़ना/हटाना और उनका मेटा डेटा एक अलग एप्लिकेशन (या फ़ंक्शन) है जिसे डिज़ाइन, कार्यान्वित और उपयोग किया जाना चाहिए। – NVRAM

6

किसी सिद्धांत के दृष्टिकोण से समस्या को संबोधित करते हुए, एक संबंधित डेटाबेस (मुख्य रूप से) संरचित डेटा संग्रहीत करने के लिए वहां है। यदि आप कोई क्वेरी स्थिति नहीं बना सकते हैं या डेटा तत्व पर शामिल नहीं हो सकते हैं तो यह शायद डेटाबेस में नहीं है। मुझे एक WHERE खंड में उपयोग की जाने वाली छवि BLOB नहीं दिखाई दे रही है, इसलिए मैं इसे डेटाबेस के बाहर रखूंगा। दूसरी तरफ एक सीएलओबी प्रश्नों में इस्तेमाल किया जा सकता है।

+0

+1 दिलचस्प पहलू – paul

+2

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

+2

लेकिन आप * फोन नंबर पर एक क्वेरी शर्त बना सकते हैं, या इसमें शामिल होने के लिए इसका उपयोग कर सकते हैं, कुछ ऐसा जो आप बीएलओबी कॉलम के साथ उचित रूप से नहीं कर सकते हैं। –

8

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

+0

"LOB" क्या है? –

+0

@ मैथ्यू मुझे लगता है कि उनका मतलब था [बड़े ओब्जेक्ट] (https://docs.oracle.com/cd/B28359_01/appdev.111/b28393/adlob_glossary.htm#sthref1212)। –

3

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

आपको फाइल सिस्टम में फ़ाइल का संदर्भ संग्रहीत करना चाहिए। का सर्वोत्तम अभ्यास एक फ़ाइल नाम है, पूर्ण (या यहां तक ​​कि सापेक्ष) पथ नहीं।

+0

जहां तक ​​"चयन *" जाता है, मुझे लगता है कि ज्यादातर परिस्थितियों में यह उचित है। मैंने एक ओआरएम बनाया जो इसे पूरी तरह से उपयोग करता है, लेकिन आप इसे ओवरराइड कर सकते हैं। और यदि आप प्रदर्शन के बारे में वास्तव में चिंतित हैं, तो आप ओआरएम को पूरी तरह से बाईपास कर सकते हैं और क्वेरी बिल्डर का उपयोग दृश्यों के पीछे ओआरएम का उपयोग कर सकते हैं। मुद्दा यह है कि इस वार्तालाप के पास "चयन * ..." से कोई लेना देना नहीं है। इसे ध्वनि डेटाबेस डिजाइन के साथ करना है। –

+0

यदि फ़ाइल का नाम केवल पथ पर संग्रहीत नहीं किया जाता है तो आप फ़ाइल को कैसे पुनर्प्राप्त करते हैं? क्या आपके पास एक फ़ोल्डर होगा जहां सभी फाइलें रखी जाएंगी? अगर मेरे डीबी में लाखों फाइलें हैं तो क्या होगा? – Vincnetas

+0

कॉन्फ़िगरेशन में कहीं भी कॉन्फ़िगरेशन में, आपको उस निर्देशिका को पथ संग्रहीत करना चाहिए जहां फ़ाइलों को संग्रहीत किया जाता है। यदि आप एक ही निर्देशिका में फाइलें रखने के बारे में चिंतित हैं, तो पथ को गतिशील रूप से बनाएं। आम तौर पर आप इसके लिए एक आईडी का उपयोग कर सकते हैं, जैसे/path/to/files/{ID here} /filename.ext। आपको केवल फ़ाइल नाम स्टोर करने की आवश्यकता है। –

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

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