database - مشكلة - كود اللغة العربية php




تخزين الصور في DB-نعم أو ناي؟ (20)

أنا المسؤول عن بعض التطبيقات التي تدير العديد من TB من الصور. لقد وجدنا أن تخزين مسارات الملفات في قاعدة البيانات هو الأفضل.

هناك مشكلتان:

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

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

ما رأيك في الايجابيات / السلبيات؟


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

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

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

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

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

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


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

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


إليكم ورقة بيضاء مثيرة للاهتمام حول هذا الموضوع.

إلى BLOB أو لا إلى BLOB: تخزين كائن كبير في قاعدة بيانات أو نظام ملفات

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

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

إليك نقطة إضافية يجب وضعها في الاعتبار. أحد أسباب دعم استخدام قاعدة بيانات لتخزين النقاط هو توافق ACID. ومع ذلك ، فإن الأسلوب الذي استخدمه المختبرون في الورقة البيضاء ، (خيار Bulk Logged من SQL Server ،) والذي أدى إلى تضاعف سرعة نقل SQL Server ، أدى فعليًا إلى تغيير "D" في ACID إلى "d" ، حيث لم يتم تسجيل بيانات blob الكتابة الأولية لهذه الصفقة. لذلك ، إذا كان التوافق الكامل لـ ACID هو أحد المتطلبات الهامة للنظام الخاص بك ، فقم بتخفيض أرقام بيانات SQL Server في كتابة قاعدة البيانات عند مقارنة ملف الإدخال / الإخراج إلى I / O blob لقاعدة البيانات.


الكلمة في الشارع هي أنه ما لم تكن بائع قاعدة بيانات يحاول أن يثبت أن قاعدة البيانات الخاصة بك يمكن أن تفعلها (مثل ، لنفترض أن Microsoft تتفاخر حول Terraserver بتخزين صور bajillion في SQL Server) فهي ليست فكرة جيدة. عندما يكون البديل - تخزين الصور على خوادم الملفات والمسارات في قاعدة البيانات أسهل بكثير ، لماذا تهتم؟ تعتبر حقول Blob نوعًا ما مثل قدرات سيارات الدفع الرباعي على الطرق الوعرة - معظم الناس لا يستخدمونها ، وأولئك الذين عادة ما يواجهون المشاكل ، ومن ثم هناك من يفعلون ذلك ، ولكن فقط للمتعة منه.


المشكلة مع تخزين filepaths فقط إلى الصور في قاعدة بيانات هي أن تكامل قاعدة البيانات لم يعد يمكن فرض.

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

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


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

إذا كان لديك صورك في نظام ملفات و شخص ما يقرأ الملف أثناء كتابة إصدار جديد أو حتى حذف الملف - ماذا يحدث؟

نستخدم النقط لأنها أسهل في الإدارة (النسخ الاحتياطي ، النسخ المتماثل ، النقل) أيضًا. انهم يعملون جيدا بالنسبة لنا.


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

مرة واحدة الحل المشترك لهذا هو تجزئتها إلى شجرة متوازنة من الدلائل الفرعية.


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


في الأماكن التي يجب عليك فيها ضمان التكامل المرجعي والتوافق مع ACID ، يلزم تخزين الصور في قاعدة البيانات.

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


في شركة كنت أعمل فيها ، قمنا بتخزين 155 مليون صورة في قاعدة بيانات Oracle 8i (ثم 9i). يستحق 7.5 تيرابايت.


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

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


كما قال آخرون أن مزود 2008 يأتي بنوع Filestream الذي يسمح لك بتخزين اسم الملف أو المعرف كمؤشر في ديسيبل ويقوم بتخزين الصورة تلقائيًا على نظام الملفات الخاص بك وهو سيناريو رائع.

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

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

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

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


كما هو الحال مع معظم القضايا ، ليست بسيطة كما يبدو. هناك حالات يكون فيها من المنطقي تخزين الصور في قاعدة البيانات.

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

من ناحية أخرى هناك مشاكل مرتبطة

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

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

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

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

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

نأمل أن هذا ليس كثيرًا من الثرثرة ، لكنني رأيت الموضوع وأردت تقديم بعض رؤيتي من تطبيق صغير الحجم نسبياً / صغير نسبياً.


لقد قمت مؤخرًا بإنشاء تطبيق PHP / MySQL الذي يقوم بتخزين ملفات PDF / Word في جدول MySQL (بحجم كبير يصل إلى 40 ميغابايت لكل ملف حتى الآن).

الايجابيات:

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

سلبيات:

  • يأخذ mysqldump الآن وقت looooong لأن هناك 500MB من بيانات الملف في أحد الجداول.
  • عموما ليست ذاكرة / وحدة المعالجة المركزية فعالة بالمقارنة مع نظام الملفات

أسمي تنفيذي بنجاح ، فهو يعتني بمتطلبات النسخ الاحتياطي ويبسط تخطيط المشروع. الأداء جيد للأشخاص 20-30 الذين يستخدمون التطبيق.



من المؤكد أن مسارات الملفات في قاعدة البيانات هي الطريقة المثلى - لقد سمعت قصة بعد قصة من العملاء الذين لديهم TB من الصور التي تحولت إلى كابوس يحاول تخزين أي كمية كبيرة من الصور في DB - إن الأداء الذي يصيب وحده أكثر من اللازم.


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

IMO ، الايجابيات من استخدام قاعدة البيانات لتخزين الصور هي ،

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

إذا كانت الصور الخاصة بك ستكون صغيرة (قل <64k) ومحرك التخزين الخاص بـ db يدعم مضمنة (في السجل) BLOBs ، فإنه يحسن الأداء أكثر حيث لا يتطلب الأمر أي indirection (يتم تحقيق محلية المرجع).

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


يقدم SQL Server 2008 حلاً يحتوي على أفضل ما في العالمين: نوع بيانات filestream .

أدرها كجدول عادي وأداء نظام الملفات.





blob