سؤال

توجد بعض الأسئلة الجيدة جدًا هنا في SO حول إدارة الملفات وتخزينها ضمن مشروع كبير.

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

الأول يحتوي على بعض الأفكار الرائعة وفي مشروعي قررت اتباع مسار الملف وليس مسار قاعدة البيانات.

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

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

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

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

(المشروع موجود على حزمة LAMP (PHP) إذا كان ذلك يساعد على الإطلاق)

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

المحلول

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

/images/{0}/{1}/{2}

{0}: file_number % 100
{1}: (file_number / 100) % 100
{2}: file_number

نصائح أخرى

لقد واجهت هذه المشكلة منذ بعض الوقت بالنسبة لموقع ويب كان يستضيف الكثير من الملفات.ما فعلناه هو أخذ المعرف الفريد العمومي (GUID) (وهو أيضًا حقل المفتاح الأساسي للملف) (على سبيل المثال.BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) وقم بتخزين ملف مثل هذا:/B/C/C/BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301/filename.ext

وهذا له مزايا معينة:

  • يمكنك توسيع نطاق خوادم الملفات عبر خوادم متعددة (وتخصيص أدلة محددة لكل منها)
  • ليس عليك إعادة تسمية الملف
  • الدلائل الخاصة بك مضمونة لتكون فريدة من نوعها

أتمنى أن يساعدك هذا!

لتجنب إنشاء عدد زائد من الإدخالات في دليل واحد، قد ترغب في تأسيس إنشاء الدلائل على أجزاء من اسم الملف.على سبيل المثال، إذا كان لديك ملف باسم d7f5ae9b7c5a.png، فقد ترغب في تخزينه في media/d7/f5/d7f5ae9b7c5a.png.إذا كانت أسماء الملفات الخاصة بك كلها ست عشرية، فسيؤدي ذلك إلى تقييد عدد الإدخالات في دليل واحد إلى 256 حتى المستوى النهائي.

  1. صورة مستخدم واحدة ~ 100 كيلو بايت، لذلك دع 10000 مستخدم في قاعدة البيانات، سيكون لدى كل مستخدم في المتوسط ​​5 صور، لذلك سيكون لدينا 5 تيرابايت قاعدة بيانات، وسيتم تنفيذ كل إخراج صورة عبر قاعدة بيانات وستؤدي حركة مرور قاعدة البيانات الإضافية هذه إلى تقليل الأداء العام لخادم قاعدة البيانات....يمكنك استخدام مجموعة قاعدة البيانات لتجنب ذلك، ولكن لنفترض أنها باهظة الثمن

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

  3. في لحظة واحدة يمكنك أن تقرر وضع الصور على بعض CDN، ما هي التغييرات في كود المصدر الخاص بك؟

عادة ما أتبع هذا النهج:

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

لذا، إذا كان الملف موجودًا في /www/uploads/image.jpg، فإن إعداداتك المتغيرة تشير إلى /www/uploads، حيث يحتوي صف قاعدة بياناتك على image.jpg.هذه طريقة مرنة لفصل بنية دليل الأنظمة الخاصة بك عن تطبيقك.

علاوة على ذلك، يمكنك تجزئة تخزين الملفات في الدلائل بناءً على جداول قاعدة البيانات التي تتعلق بها.لنفترض أن لديك جدولًا لتقارير المستخدم وجدولًا لصور المستخدم.يمكنك تخزين الملفات المتعلقة بتقارير user_reports في /www/uploads/user_reports.إذا كان لديك عدد كبير من تحميلات المستخدم، فيمكنك تنفيذ التجزئة بشكل أكبر.لنفترض أن أحد المستخدمين قام بتحميل ملف في 20.03.2009، فإن الملف يسمى report.pdf، لذا يمكنك تخزينه على /www/uploads/user_reports/2009/03/20/report.pdf.

لا أستطيع أن أقول الكثير عن كيفية إدارة الملفات بواسطة apache و PHP، ولكن يمكنني أن أقول شيئًا عن نظام الملفات ext3.لا يبدو أن نظام ext3 يواجه مشكلات مع الأعداد الكبيرة من الملفات الموجودة في نفس الدليل.لقد قمت باختباره مع ما يصل إلى مليون ملف.تأكد من تمكين خيار dir_index على نظام الملفات قبل إنشاء الدلائل.يمكنك التحقق من خلال تشغيل dump2fs وتغيير هذا الخيار عن طريق تشغيل tune2fs.يمكن أن يظل تجزئة الملفات في شجرة من الدلائل الفرعية مفيدًا لأن أدوات سطر الأوامر لا تزال تواجه مشكلات في سرد ​​محتويات الدليل.

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