للقيام أو عدم القيام به:تخزين الصور في قاعدة بيانات [نسخة مكررة]

StackOverflow https://stackoverflow.com/questions/815626

  •  03-07-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

في سياق تطبيق الويب، كان مديري القديم يقول دائمًا ضع إشارة إلى صورة في قاعدة البيانات، وليس الصورة نفسها.أميل إلى الموافقة على أن تخزين عنوان url مقابل تخزينه.الصورة نفسها في قاعدة البيانات فكرة جيدة، ولكن حيث أعمل الآن، نقوم بتخزين الكثير من الصور في قاعدة البيانات.

السبب الوحيد الذي يمكنني التفكير فيه هو أنه ربما يكون أكثر أمانًا؟أنت لا تريد أن يكون لدى شخص ما رابط مباشر لعنوان url؟ولكن إذا كان الأمر كذلك، فيمكنك دائمًا جعل موقع الويب/الخادم يتعامل مع الصور، مثل المعالجات في asp.net بحيث يحتاج المستخدم إلى المصادقة لعرض الصورة.أعتقد أيضًا أن الأداء سيتضرر من خلال سحب الصور من قاعدة البيانات.هل هناك أي أسباب أخرى تجعل تخزين الصور في قاعدة بيانات فكرة جيدة/غير جيدة؟


التكرار الدقيق: صور المستخدم:قاعدة البيانات أو تخزين نظام الملفات؟
التكرار الدقيق: تخزين الصور في قاعدة البيانات:نعم أم لا؟
التكرار الدقيق: هل يجب أن أقوم بتخزين صوري في قاعدة البيانات أو المجلدات؟
التكرار الدقيق: هل ستقوم بتخزين البيانات الثنائية في قاعدة البيانات أو المجلدات؟
التكرار الدقيق: هل تريد تخزين الصور كملفات أو قاعدة بيانات لتطبيق ويب؟
التكرار الدقيق: تخزين عدد قليل من الصور:النقطة أو خ؟
التكرار الدقيق: تخزين الصورة في نظام الملفات أو قاعدة البيانات؟

هل كانت مفيدة؟

المحلول

اذا أنت في بعض الأحيان تحتاج إلى استرداد صورة ويجب أن تكون متاحة على عدة خوادم ويب مختلفة.ولكن أعتقد أن هذا إلى حد كبير.

  • إذا لم يكن من الضروري أن تكون متاحة على عدة خوادم، فمن الأفضل دائمًا وضعها في نظام الملفات.
  • إذا كان يجب أن يكون متاحًا على عدة خوادم وكان هناك بالفعل نوع من التحميل في النظام، فستحتاج إلى نوع من التخزين الموزع.

نحن نتحدث هنا عن حالة حافة، حيث يمكنك تجنب إضافة مستوى إضافي من التعقيد إلى نظامك من خلال الاستفادة من قاعدة البيانات.

بخلاف ذلك، لا تفعل ذلك.

نصائح أخرى

إيجابيات وضع الصور في قاعدة البيانات.

  1. المعاملات.عند حفظ الكائن الثنائي الكبير، يمكنك تنفيذه تمامًا مثل أي جزء آخر من بيانات قاعدة البيانات.وهذا يعني أنه يمكنك الالتزام بالنقطة مع أي من البيانات التعريفية المرتبطة والتأكد من أن الاثنين متزامنان.إذا نفدت مساحة القرص؟لا التزام.لم يتم تحميل الملف بالكامل؟لا التزام.خطأ سخيف في التطبيق؟لا التزام.إذا كان الحفاظ على اتساق الصور وبيانات التعريف المرتبطة بها مع بعضها البعض أمرًا مهمًا لتطبيقك، فإن المعاملات التي يمكن أن توفرها قاعدة البيانات يمكن أن تكون نعمة.

  2. نظام واحد للإدارة.هل تحتاج إلى عمل نسخة احتياطية من البيانات التعريفية والنقط؟نسخ احتياطي لقاعدة البيانات.هل تحتاج إلى تكرارها؟نسخ قاعدة البيانات.هل تحتاج إلى التعافي من فشل جزئي في النظام؟أعد تحميل قاعدة البيانات وقم بتحريك السجلات للأمام.تنطبق جميع المزايا التي توفرها قواعد البيانات على البيانات بشكل عام (تعيين الحجم، والتحكم في التخزين، والنسخ الاحتياطي، والنسخ المتماثل، والاسترداد، وما إلى ذلك) على الكائنات النقطية الخاصة بك.مزيد من الاتساق وإدارة أسهل.

  3. حماية.تحتوي قواعد البيانات على ميزات أمان دقيقة للغاية يمكن الاستفادة منها.المخططات وأدوار المستخدم وحتى أشياء مثل "طرق العرض للقراءة فقط" لمنح الوصول الآمن إلى مجموعة فرعية من البيانات.تعمل كل هذه الميزات مع الجداول التي تحتوي على النقط أيضًا.

  4. إدارة مركزية.يتعلق الأمر بالرقم 2، ولكن في الأساس يمكن لمسؤولي قواعد البيانات (كما لو أنهم لا يملكون القوة الكافية) إدارة شيء واحد:قاعدة البيانات.تعمل قواعد البيانات الحديثة (خاصة الكبيرة منها) بشكل جيد للغاية مع عمليات التثبيت الكبيرة عبر العديد من الأجهزة.مصدر واحد للإدارة يبسط الإجراءات، ويبسط نقل المعرفة.

  5. تتعامل معظم قواعد البيانات الحديثة مع النقط بشكل جيد.مع دعم من الدرجة الأولى للكائنات النقطية في طبقة البيانات الخاصة بك، يمكنك بسهولة دفق النقط من قاعدة البيانات إلى العميل.في حين أن هناك عمليات يمكنك القيام بها والتي من شأنها "امتصاص" النقطة بأكملها مرة واحدة، إذا لم تكن بحاجة إلى هذه الميزة، فلا تستخدمها.ادرس واجهة SQL لقاعدة البيانات الخاصة بك واستفد من ميزاتها.لا يوجد سبب لمعاملتها مثل "خيوط كبيرة" يتم التعامل معها بشكل متجانس وتحول نقاطك إلى قنابل كبيرة تلتهم الذاكرة وتحطم ذاكرة التخزين المؤقت.

  6. تمامًا مثلما يمكنك إعداد خوادم ملفات مخصصة للصور، يمكنك إعداد خوادم blob مخصصة في قاعدة البيانات الخاصة بك.امنحهم وحدات تخزين مخصصة للأقراص، ومخططات مخصصة، وذاكرة تخزين مؤقت مخصصة، وما إلى ذلك.جميع بياناتك في قاعدة البيانات ليست هي نفسها، أو تتصرف بنفس الطريقة، ولا يوجد سبب لتكوينها بنفس الطريقة.تتمتع قواعد البيانات الجيدة بمستوى جيد من التحكم.

تتمثل المشكلة الأساسية فيما يتعلق بتقديم كائن ثنائي كبير الحجم من قاعدة بيانات في التأكد من أن طبقة HTTP الخاصة بك تستفيد فعليًا من كل بروتوكول HTTP لأداء الخدمة.

العديد من التطبيقات الساذجة تقوم ببساطة بالاستيلاء على النقطة وتفريغها بالجملة في المقبس.لكن HTTP يحتوي على العديد من الميزات المهمة المناسبة تمامًا لتدفق الصور، وما إلى ذلك.لا سيما التخزين المؤقت للرؤوس وعلامات ETag والنقل المقسم للسماح للعملاء بطلب "أجزاء" من النقطة.

تأكد من أن خدمة HTTP الخاصة بك تفي بجميع هذه الطلبات بشكل صحيح، ويمكن أن تكون قاعدة البيانات الخاصة بك مواطن ويب جيدًا جدًا.من خلال تخزين الملفات مؤقتًا في نظام ملفات للعرض بواسطة خادم HTTP، فإنك تحصل على بعض هذه المزايا "مجانًا" (نظرًا لأن الخادم الجيد سيفعل ذلك على أي حال للموارد "الثابتة")، ولكن تأكد إذا قمت بذلك، تكريم أشياء مثل مواعيد التعديل وما إلى ذلك.للصور.

على سبيل المثال، يطلب شخص ما spacehuttle.jpg، وهي صورة تم إنشاؤها في 1 يناير 2009.وينتهي الأمر بتخزينه مؤقتًا على نظام الملفات في تاريخ الطلب، على سبيل المثال، 1 فبراير 2009.لاحقًا، تتم إزالة الصورة من ذاكرة التخزين المؤقت (سياسة FIFO، أو أي شيء آخر)، ويطلبها شخص ما، لاحقًا، في 1 مارس 2009، مرة أخرى.حسنًا، أصبح الآن "تاريخ الإنشاء" هو 1 مارس 2009، على الرغم من أن تاريخ الإنشاء طوال الوقت كان في الواقع 1 يناير.لذلك، يمكنك أن ترى، خاصة إذا كانت ذاكرة التخزين المؤقت الخاصة بك تتنقل كثيرًا، فإن العملاء الذين قد يستخدمون رؤوس If-Modified قد يحصلون على بيانات أكثر مما يحتاجون إليه بالفعل، نظرًا لأن الخادم يعتقد أن المورد قد تغير، في حين أنه لم يتغير في الواقع.

إذا احتفظت بتاريخ إنشاء ذاكرة التخزين المؤقت متزامنًا مع تاريخ الإنشاء الفعلي، فقد يكون ذلك أقل مشكلة.

لكن النقطة المهمة هي أنه شيء يجب التفكير فيه حول المشكلة برمتها حتى تصبح "مواطنًا جيدًا على الويب"، وتوفر عليك وعلى عملائك بعض النطاق الترددي وما إلى ذلك.

لقد قمت للتو بمراجعة كل هذا لمشروع Java الذي يقدم مقاطع فيديو من قاعدة بيانات، وكل شيء يعمل بشكل رائع.

أدرك أن غالبية محترفي قواعد البيانات سوف يعربون أصابعهم ويهسهسون عليك إذا قمت بتخزين الصور في قاعدة البيانات (أو حتى ذكر ذلك).نعم، هناك بالتأكيد آثار على الأداء والتخزين عند استخدام قاعدة البيانات كمستودع لكتل ​​كبيرة من البيانات الثنائية من أي نوع (تميل الصور فقط إلى أن تكون الأجزاء الأكثر شيوعًا من البيانات التي لا يمكن تطبيعها).ومع ذلك، هناك بالتأكيد ظروف لا يكون فيها تخزين الصور في قاعدة البيانات مسموحًا به فحسب، بل أيضًا المستحسن.

على سبيل المثال، في وظيفتي القديمة كان لدينا تطبيق حيث يمكن للمستخدمين إرفاق الصور بعدة نقاط مختلفة من التقرير الذي كانوا يكتبونه، وكان لا بد من طباعة تلك الصور عند الانتهاء من ذلك.تم نقل هذه التقارير عبر النسخ المتماثل لـ SQL Server، وكان من الممكن أن يسبب صداعًا كبيرًا لمحاولة إدارة هذه الصور ومسارات الملفات عبر أنظمة وخوادم متعددة بأي نوع من الموثوقية.لقد منحنا تخزينها في قاعدة البيانات كل ذلك "مجانًا"، ولم يكن من الضروري أن تنتقل أداة الإبلاغ إلى نظام الملفات لاسترداد الصورة.

نصيحتي العامة هي عدم قصر نفسك على نهج واحد أو آخر - استخدم الأسلوب الذي يناسب الموقف.تعد أنظمة الملفات جيدة جدًا في تخزين الملفات، كما أن قواعد البيانات جيدة جدًا في توفير أجزاء صغيرة من البيانات عند الطلب.ومن ناحية أخرى، يتطلب أحد منتجات شركتي تخزين حالة التطبيق بالكامل في قاعدة البيانات، مما يعني أن مرفقات الملفات تدخل هناك أيضًا.مع خادم قاعدة البيانات (SQL Server 2005) الخاص بنا، لم أواجه بعد مشكلات أداء ملحوظة حتى مع العملاء الكبار وقواعد البيانات.

يمنحك Microsoft SQL 2008 أفضل ما في كلا العالمين من خلال ميزة FileStream - قد يكون من المفيد التحقق منه. http://technet.microsoft.com/en-us/library/bb933993.aspx

إحدى مزايا تخزين الصور في قاعدة البيانات هي أنها قابلة للنقل عبر الأنظمة ومستقلة عن تخطيط نظام (أنظمة) الملفات.

الحل الأبسط/الأكثر أداءً/الأكثر قابلية للتطوير هو تخزين صورك على نظام الملفات.إذا كان الأمان هو مصدر القلق، فضعهم في موقع لا يمكن الوصول إليه بواسطة خادم الويب واكتب برنامجًا نصيًا يتعامل مع الأمان ويقدم الملفات.

بافتراض أن خادم الويب/التطبيق الخاص بك وخادم قاعدة البيانات جهازان مختلفان، فسوف تحصل على بعض النتائج عن طريق وضع الصور في قاعدة البيانات:(1) زمن استجابة الشبكة بين الجهازين، (2) الحمل الزائد لاتصال قاعدة البيانات، (3) استهلاك اتصال قاعدة بيانات إضافي لكل صورة يتم تقديمها.سأكون مهتمًا أكثر بالنقطة الأخيرة:إذا كان موقعك يقدم الكثير من الصور، فستستهلك خوادم الويب الخاصة بك العديد من اتصالات قاعدة البيانات ويمكن أن تستنفد مجمعات الاتصال الخاصة بك.

إذا كان تطبيقك يعمل على خوادم متعددة، فسوف أقوم بتخزين النسخة المرجعية من صورك في قاعدة البيانات ثم تخزينها مؤقتًا عند الطلب على أنظمة الملفات.إن القيام بذلك هو مجرد ألم أقل عرضة للخطأ من محاولة مزامنة أنظمة الملفات بشكل جانبي.

إذا كان تطبيقك موجودًا على خادم واحد، فنعم، التزم بنظام الملفات واطلب من قاعدة البيانات الحفاظ على مسار للبيانات.

بالطبع، لم يتم تصميم معظم قواعد بيانات SQL مع وضع الصور في الاعتبار، ولكن هناك قدرًا معينًا من الراحة المرتبطة بوجودها في قاعدة البيانات.

على سبيل المثال، إذا كان لديك بالفعل قاعدة بيانات قيد التشغيل وتم تكوين النسخ المتماثل.لديك على الفور مخزن صور HA بدلاً من محاولة تشغيل بعض عمليات النسخ المتماثل لنظام الملفات المستند إلى rsync أو nfs.كما أن وجود مجموعة من عمليات الويب (أو تصميم بعض الخدمات الجديدة) لكتابة الملفات على القرص يزيد من تعقيدك قليلاً.في الواقع، إنها مجرد أجزاء متحركة أكثر.

على أقل تقدير، أوصي بالاحتفاظ بالبيانات "الوصفية" حول الصورة (مثل أي أذونات، ومن يملكها، وما إلى ذلك) والبيانات الفعلية مفصولة في جداول مختلفة بحيث يكون من السهل إلى حد ما التبديل إلى مخزن بيانات مختلف. الخط.يجب أن يمنحك ذلك، إلى جانب نوع ما من CDN أو التخزين المؤقت، أداءً جيدًا إلى حد ما، لذلك أفترض أن ذلك يعتمد على مدى قابلية هذا التطبيق للتطوير وكيفية موازنة ذلك مع سهولة التنفيذ.

ليس عليك تخزين عنوان URL (إذا كنت تشعر أن هذا غير آمن).يمكنك فقط تخزين معرف فريد يشير إلى الصورة في مكان آخر.

يميل تخزين قاعدة البيانات إلى أن يكون أكثر تكلفة وتكلفة في الصيانة من نظام الملفات - وبالتالي لن أقوم بتخزين الكثير من الصور في قاعدة بيانات.

لا يعد التعافي من الكوارث أمرًا ممتعًا على الإطلاق عندما يكون لديك تيرابايت من بيانات الصور المخزنة في قاعدة البيانات.من الأفضل أن تجد طريقة أفضل لتوزيع بياناتك لجعلها أكثر موثوقية وما إلى ذلك ...بالطبع يتم مضاعفة كل النفقات العامة (المذكورة أعلاه) عند التكرار وما إلى ذلك ...

فقط لا تفعل ذلك!

يبدو هذا حقًا وكأنه مشكلة KISS (اجعل الأمر بسيطًا غبيًا).تم تصميم أنظمة الملفات للتعامل بسهولة مع تخزين ملفات الصور، ولكن ليس من السهل القيام بذلك في قاعدة البيانات ومن السهل إتلاف البيانات.لماذا تحصل على نتيجة أداء وكل الصعوبات في SQL والعرض عندما يمكنك فقط القلق بشأن أمان الملفات؟يمكنك أيضًا التعامل مع الأنظمة المختلطة باستخدام NFS أو CIFS.أنظمة الملفات هي تقنيات ناضجة.أبسط بكثير، وأكثر قوة.

لقد قمت بتخزين الصور في قاعدة بيانات لتطبيق العرض التوضيحي.كان السبب وراء قيامي بذلك هو الأمان - فحذف سجل لم يكن من المفترض أن أحذفه لم يكن يمثل مشكلة كبيرة، ولكن حذف ملف لم يكن من المفترض أن أحذفه ربما كان يمثل مشكلة!

إذا أصبح الأداء مشكلة، كنت قد قمت بالتحقيق فيما إذا كان حذف الملفات المارقة هو احتمال حقيقي أم لا.

إذا كانت الصور يتم سحبها من قاعدة البيانات بشكل منتظم، فسأحاول دائمًا استخدام نظام الملفات.

إذا كانت هناك صور تحتاج إلى سحبها من حين لآخر، وحفظها في قاعدة البيانات يجعل الحياة أسهل، فليس لدي أي مشكلة على الإطلاق في هذا.

  • قاعدة بيانات للبيانات
  • نظام الملفات للملفات
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top