أين يجب أن أخزن الصور؟ نظام الملفات أو قاعدة البيانات؟ [مكرر

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

  •  20-09-2019
  •  | 
  •  

سؤال

تكرار ممكن:
تخزين الصور والمستندات التي تم تحميلها - نظام الملفات مقابل قاعدة البيانات

بدأت في تطوير تطبيق ويب ، والغرض الأساسي هو عرض الصور. سيتمكن المستخدمون من تحميل الصور أيضًا.

كان السؤال الأول الذي ظهر هو مكان تخزين الصور: على نظام الملفات أو قاعدة البيانات.

سأستخدم مربع Windows لاستضافة الموقع. قاعدة البيانات هي MySQL ورمز الخلفية في C# باستخدام ASP.NET MVC.

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

المحلول

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

من الجيد أيضًا تقسيم الصور على نظام الملفات ، لذلك لا ينتهي بك الأمر بملايين الملفات في دليل واحد. لذلك سيكون لديك شيء مثل هذا:

storage/00/e4/f56c0de1c61fdb926e79e8a0a65bd12930c9.jpg
storage/25/9a/ec1c55bfb660548a6770238668c4b117d92f.jpg
storage/5d/d5/4b01d98f17a9ad9dd1526b49ba39b5aa37a1.jpg
storage/63/49/6f740b6c284ce6685dc17d473a7360ace249.jpg
storage/b1/75/066d178188dde110149a8422ab651b0ee615.jpg
storage/b1/20/a2b7d02b7b0c43530677ab06235382a37e20.jpg
storage/da/39/a3ee5e6b4b0d3255bfef95601890afd80709.jpg

من السهل أيضًا التنفيذ إذا انتقلت إلى التخزين المتدحرج.

نصائح أخرى

إذا كنت تستخدم SQL Server 2008 ، فهناك نوع بيانات FileStream يتولى معظم المشكلات المذكورة حول زيادة حجم DB. إنه يتعامل مع جميع التفاصيل المزعجة للمزامنة بين نظام الملفات والجدول.

انظر هنا للحصول على منشور مدونة حول الموضوع: تخزين أي بيانات في SQL Server 2008 (Katmai)

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

أيضا ، لدى Amazon S3 أو غيرهم من مقدمي الخدمات السحابية مزاياهم. على سبيل المثال ، ستوفر S3 + Amazon CloudFront أداءً جيدًا. تقوم Cloudfront بتخزين ملفاتك على الخوادم في جميع أنحاء العالم بحيث يمكن الوصول إليها بسهولة/سريعة من أي مكان. ولكن إذا كنا نتحدث عن الصور وأصبح الموقع شائعًا ، فقد تكون فواتيرك مرتفعة للغاية.

ل S3 رسوم الأمازون لكل سعة التخزين ونقلها داخل/خارج السحابة. ل Cloudfront لكل نقل.

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

أود استخدام شيء مثل Amazon S3.

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

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

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

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

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

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

من المؤكد أنه من السريع الحصول على البيانات دون الانسحاب من DB. في نهاية المطاف كان ذلك عاملاً حاسماً رئيسياً.

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

تعديل

بطاقة تعريف
varbinary

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

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