SQL सर्वर में चित्र संग्रहीत करना?


191

मैंने एक छोटी सी डेमो साइट बनाई है और उस पर मैं एक छवि कॉलम के भीतर sql सर्वर पर चित्र संग्रहीत कर रहा हूं। कुछ प्रश्न मेरे पास हैं ...

  • क्या यह एक बुरा विचार है?

  • क्या यह बढ़ने पर मेरी साइट पर प्रदर्शन को प्रभावित करेगा?

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


5
क्या 2017 में इस मुद्दे के लिए कोई नया जोड़ है? क्या यह आज भी मान्य है?
हाइकाल नाशुहा

जवाबों:


271

Microsoft अनुसंधान द्वारा वास्तव में एक अच्छा पेपर है जिसे To Blob या Not To Blob कहा जाता है ।

बड़ी संख्या में प्रदर्शन परीक्षण और विश्लेषण के बाद उनका निष्कर्ष यह है:

  • यदि आपके चित्र या दस्तावेज़ आमतौर पर आकार में 256KB से कम हैं, तो उन्हें डेटाबेस VARBINARY कॉलम में संग्रहीत करना अधिक कुशल है

  • यदि आपके चित्र या दस्तावेज़ आम तौर पर 1 एमबी से अधिक आकार के हैं, तो उन्हें फ़ाइल सिस्टम में संग्रहीत करना अधिक कुशल है (और SQL सर्वर 2008 के FILESTREAM विशेषता के साथ, वे अभी भी लेन-देन नियंत्रण और डेटाबेस के भाग के तहत हैं)

  • उन दोनों के बीच में, यह आपके उपयोग के आधार पर एक टॉस-अप का एक सा है

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

Filegroups के लिए, बाहर की जाँच फ़ाइलें और Filegroup वास्तुकला एक परिचय के लिए। मूल रूप से, आप या तो शुरुआत से ही बड़ी डेटा संरचनाओं के लिए एक अलग फ़ाइल समूह के साथ अपना डेटाबेस बनाएंगे, या बाद में एक अतिरिक्त फ़ाइल समूह जोड़ सकते हैं। चलो इसे "LARGE_DATA" कहते हैं।

अब, जब भी आपके पास बनाने के लिए एक नई तालिका होती है जिसमें VARCHAR (MAX) या VARBINARY (MAX) कॉलम संग्रहीत करने की आवश्यकता होती है, तो आप इस फ़ाइल समूह को बड़े डेटा के लिए निर्दिष्ट कर सकते हैं:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

फ़ाइल समूह पर MSDN परिचय की जाँच करें, और इसके साथ खेलें!


क्या यह अच्छी बात है या बुरी बात .... • यदि आपके चित्र या दस्तावेज़ आम तौर पर 1 एमबी से अधिक आकार के हैं, तो उन्हें फाइलसिस्टम में संग्रहीत करना अधिक कुशल है (और SQL Server 2008 के FILESTREAM विशेषता के साथ, वे अभी भी लेन-देन नियंत्रण में हैं और डेटाबेस का हिस्सा)
htm11h

बहुत बढ़िया जवाब। अगर आपको विस्तार से समझाने का मन करता है कि आप छवि डेटा के लिए एक समर्पित तालिका का उपयोग करने की सलाह क्यों देते हैं, तो मैंने इसके लिए एक अलग प्रश्न d.SEE पर बनाया है
हेंजी

15

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

मुझे एक ऐसा ही सवाल मिला

छोटी PNG छवियाँ संग्रहीत करने के लिए MySQL BLOB बनाम फ़ाइल?

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

आशा करता हूँ की ये काम करेगा


14

मैं एक निर्देशिका में छवि को संग्रहीत करना पसंद करूंगा, फिर डेटाबेस में छवि फ़ाइल के लिए एक संदर्भ संग्रहीत करूंगा।

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

आप यहां फ़ाइलसमूह का उपयोग करने के बारे में अधिक पढ़ सकते हैं http://msdn.microsoft.com/en-us/library/ms179316.aspx


11

क्यों डेटाबेस में चित्रों को स्टोर करना अच्छा हो सकता है वेब सर्वर पर कैटलॉग में नहीं।

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

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

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

यदि आपने SqlServer में चित्रों को सहेजा है तो सब कुछ पहले की तरह काम करेगा।

बस मेरे 2 सेंट।


3
अच्छी बात। छवियों का बैकअप डेटाबेस बैकअप के रूप में बस के रूप में महत्वपूर्ण हैं ... कभी कभी तो और भी।
क्रिस कैटिगानी

फ़ाइल सिस्टम पर छवियों को भी नेटवर्क अनुमति की आवश्यकता है।
क्रिस कैटिगनी 16

2
नेटवर्क अनुमतियाँ एक अच्छा बिंदु है। लेकिन मुझे ऐसा कोई मामला नहीं दिखता जहाँ आप केवल DB का बैकअप रखते हों। आपके पास निश्चित रूप से एप्लिकेशन और फ़ाइलों का बैकअप होना चाहिए। आप बस आसानी से DB खो सकते हैं, लेकिन फ़ाइलें हैं।
नॉर्बर्ट नॉर्बर्टन

11

जब SQL सर्वर में चित्र संग्रहीत करते हैं तो 'छवि' डेटाटाइप का उपयोग नहीं करते हैं , एमएस के अनुसार इसे SQL सर्वर के नए संस्करणों में चरणबद्ध किया जा रहा है। उपयोग varbinary (अधिकतम) के बजाय

https://msdn.microsoft.com/en-us/library/ms187993.aspx



7

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


0

मेरे अनुभव में, किसी अन्य स्थान पर संग्रहीत छवियों के लिए यूआरएल को संग्रहीत करना एक साधारण परियोजना के लिए सबसे अच्छा तरीका है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.