هل يمكنك تخزين البيانات الثنائية في قاعدة البيانات أو في ملفات النظام ؟ [مغلقة]

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

  •  20-08-2019
  •  | 
  •  

سؤال

هذا هو السؤال الذي تم طرحه قبل (كبيرة-نص-و-الصور-في-sql) ولكن أساسا البيانات التي سيتم تغييرها.في حالتي سيتم تخزين البيانات و لم تتغير.يبدو من المعقول أن تبقي كل شيء معا.

هل هناك أي سبب لماذا لا ينبغي أن متجر ثابت الثنائية البيانات في قاعدة البيانات ؟

على افتراض أنه هو الشيء المعقول أن تفعل, هل هناك أي مزايا تخزين هذه البيانات في جداول منفصلة?(قد تبدأ أدرك الآن أنني لست DB الخبراء...)

توضيح:سيكون هناك ربما يكون هناك أكثر من 10-20 المستخدمين ولكن هذه سوف تكون في الولايات المتحدة وفي المملكة المتحدة.البيانات الثنائية سيتعين نقلها في أي حال.

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

المحلول

وميزة تخزين البيانات في DB هو الاستفادة من آليات الأمن DB وخفض تكلفة ماينتانينسي (النسخ الاحتياطي، ...). العيب منه هو زيادة الحمل DB واتصالات المستهلكة (والتي قد تكون مكلفة للخوادم قاعدة البيانات لكل اتصال مرخصة). إذا كنت تستخدم SQL Server 2008 أو FILESTREAM قد يكون بديلا لطيفة.

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

نصائح أخرى

وكل هذا الكلام عن القيام "حدد * من الجدول" مما تسبب في ذاكرة ضخمة و / أو قضايا النطاق الترددي عندما يكون الجدول LOB في أنه من غير مسألة. كل ما عاد هو مؤشر إلى LOB في السؤال. لا يكفي سمعة لوضع تعليق في نفس السياق، ولكن الناس شاهدوا هذا يجب أن يعرف انها ليست قضية.

وأكبر dissadvantage إذا كنت تخزين النقط هو استهلاك الذاكرة. يمكنك أن تتخيل ما حدد * من العاشر ستفعل لآلاف السجلات مع صورة 45K في كل؟

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

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

أنا على دراية إلى حد ما جيدة الحجم OSS مشروع قرار في نشأتها إلى تخزين الصور في قاعدة بيانات MySQL و ثبت لها أن تكون من بين أفضل 3 أفكار سيئة فقد تم التعامل مع أي وقت مضى منذ.(تفاقم الواقع "ريفاكتور بلا رحمة" هو لعنة ، ولكن تلك قصة أخرى.)

من بين مشاكل خطيرة وقد تسبب هذا:

  1. وهو ما يتجاوز الحد الأقصى من كفاءة حجم قاعدة البيانات (mysql).(مجموع المساحة المطلوبة للصور يتجاوز كل الآخرين قبل 2 على الأقل من حيث الحجم).

  2. ملفات الصور تفقد "fileness".لا مواعيد أحجام الخ.إلا إذا المخزنة (redundantly) كما التواريخ (التي تتطلب رمز الإدارة).

  3. التعسفي بايت متواليات لا العملية بشكل جيد في كل وقت ، إما تخزين أو التلاعب.

  4. "نحن لن تحتاج إلى الوصول إلى الصور خارجيا" هو افتراض خطير.

  5. هشاشة.لأن الترتيب كله هو غير طبيعي و حساس و أنت لا تعرف أين سوف لدغة المقبل (المساهمة في مكافحة ريفاكتور عقلية).

الفوائد ؟ لا أستطيع أن أفكر إلا أنه قد يكون الطريق الأقل مقاومة في ذلك الوقت.

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

وحالة استخدام آخر قد يكون كائن معقد، مثل العمل، أو حتى كائن تجارية مع الكثير من interdependancies. هل يمكن إجراء تسلسل كل من هذه إلى تنسيق ثنائي أو على أساس النص، وحفظها في DB. ثم تحصل على فائدة DB: ATOMIC، المساعدون، الخ ...

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

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

ويجب تخزين في اشارة الى الملف في نظام الملفات. أفضل الممارسات التي هي اسم الملف، وليس مسارا مطلقا (أو حتى النسبي).

ونحن تخزين مرفقات في نظامنا، وأنت لا تستطيع تغيير مرفق، لذلك أعتقد أننا على نفس الصفحة ث / البيانات التي "سيتم تخزين ويتغير قط." قررنا تحديدا <م> لا لتخزينه في قاعدة البيانات. لقد فعلنا ذلك لسببين، والبساطة، ووقت النسخ الاحتياطي / استعادة.

والبساطة أولا: في حالتنا يتم تحميل هذه المرفقات من متصفح المستخدم النهائي، وأبسط لمجرد كتابتها إلى دليل (على الخادم DB) مما هو عليه ثم لتيار عليهم الأنابيب SQL. هناك سجل منهم في DB، ولكن DB يحتوي فقط-المعلومات الوصفية حول المرفق، واسم الملف على القرص (GUID في حالتنا)

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

أليس هذا بالضبط ما LOBs أو CLOBs أو .... تم تصميمها؟

وكنا CLOBs لتخزين التشفيرات كبيرة من معاملات بطاقات الائتمان بطاقة لنظام الطيران الرئيسية.

واستهلاك الذاكرة هو أعظم المذنب الخاصة بك على الرغم من.

وHTH

والهتافات،

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

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

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

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