هل تقوم بتخزين الصور والملفات داخل قاعدة البيانات ؟

  • wgh

اتسائل ما هي الطريقة التي تتبعها عن تخزين الصور وحفظها لموقع او تطبيق او اي كان، اغلب المبرمجين يستخدمون احد هذه الطرق:

  • تخزين الملف داخل قاعدة البيانات كـ BLOB

  • تخزين الملف كملف عادي (على ال file system) ووضع رابط هذا الملف في قاعدة البيانات.

  • تخزين الملف كملف عادي (على ال file system) مع تغيير اسمه الى UUID او شيئ مشابه، ثم وضع اسمه في قاعدة البيانات.

بالنسبة لي افضل الطريقة الاولى، فهي اسهل في التعامل، واكثر اماناً، ومن السهل اخذ نسخة احتياطية ونقل قاعدة البيانات الى سيرفر آخر، عيبها الوحيد هو كبر حجم قاعدة البيانات.

ما هي الطريقة التي تتبعها انت ؟

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

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

  • الطريقة التي أتبعها الآن هي حفظ اسم الصورة فقط في قاعدة البيانات ولكن اتبع بعض القواعد في التسمية والتحجيم هي:

1- احفط اسم الصورة بامتدادها فقط في قاعدة البيانات، وهذا يُسهل من عملية نقل الموقع أو استخدام قاعدة البيانات والصور على موقع آخر.

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

3- داخل كل تصنيف للصور يكون لدي مُجلدات (large, medium, small) -وفي الغالب لا أحتاج إلا لتلك الثلاث أحجام لمقاسات الصور- يتم حفظ نُسخ بعد التحجيم بنفس اسم الصورة المُخزن في قاعدة البيانات.

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

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

استخدمت سابقا الطريقة الأولى و كانت من أسوأ الخيارات

كبر حجم قاعدة البيانات صعب بشكل كبير اخذ نسخة احتياطة أو استعادة نسخة سابقة

استخدم حاليا الخيار الثالث

مع تحياتي

ما الفرق ؟ الا تأخذ نسخة احتياطية للملفات ايضاً ؟

معاينة الملفات و أخذ نسخة احتياطية أسهل بالنسبة لي اذا كانت مخزنة كملفات

يمكن أن آخذ ال 100 ملف الأولى مثلا و اتابع لاحقا

اما اذا كانت الملفات مخزنة في قاعدة البيانات فمن الصعب معاينتها او متابع أخذ نسخة احتياطية لها مع امكانية متابعة التحميل لاحقا

و اذا افترضنا ان المطلوب فقط مزامنة الملفات الموجودة على السيرفر مع الملفات الموجودة لدي فالامر اسهل بكثير اذا كانت مخزنة كملفات واضحة

استخدم نفس طريقة الاخ @thisisyusuf تماما

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

أذكر الأمر فقط، ما أقوم به أنا هو:

  1. تصغير الصورة إلى أكبر حجم أحتاج.

  2. استخلاص هاش ال SHA1 الخاص بالصورة وتسميتها به وهو ما أضعه على قاعدة البيانات.

  3. في حال حاول المستخدم رفع صورة موجودة أصلا (التحقق من خلال ال SHA1) لا أرفع الصورة، والعكس إن كانت جديدة.

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

عند تحويل الصورة الى base64 فان حجمها يزداد بنسبة ٣٣٪

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

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

عند تحويل الصورة الى base64 فان حجمها يزداد بنسبة ٣٣٪

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

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

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

قم بإنشاء مجلد داخل مشروعك خاص بالصور

وفي قاعدة البيانات قم فقط بحظ مسار الصورة

ومن ثم قم باستدعاء مسار الصورة من قاعدة البيانات داخل الكود الخاص بك لإستدعاء الصورة

-1

هذه اسوء طريقة، لا انصحك ان تستمر عليها.

هل من الممكن ان تشرح لماذا ؟

المشكلة بحفظ المسار، وهذا سيلزمك بلمحافظة على هذا المسار حتى عند النقل الى سيرفر آخر مثلاً، وتصبح مشكلة اكبر عند النقل الى نظام تشغيل آخر، او وجود فراغات في المسار يسبب ايضاً بعد المشاكل، ماذا لو قررت فصل السيرفر الخاص بالصور مثلاً ؟

طبعاً حل هذه المشاكل ممكن لكن الاسهل هو تغيير اسم الصورة الى شيئ ك UUID وحفظ الاسم فقط، ثم وضع المسار في ملف الاعدادت، فيمكن تغييره بسهولة.

mo7@mmed أضف ردا

ولماذا ؟

اعتقد أن هذه الطريقة هي الأكثر استخداماً إن لم اكن مخطئاَ...