سؤال

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

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

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

المحلول

واحدة من أكبر المشكلات التي لاحظتها مع جميع ORMS التي استخدمتها هي تحديث عدد قليل من الحقول دون استرداد الكائن أولاً.

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

نصائح أخرى

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

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

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

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

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

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

لماذا جميع التجريد بين الكود وقاعدة البيانات؟ لماذا لا يمكننا استخدام ما نعرفه بالفعل؟ عادةً ما يعرف Dev Web Language ولغة DB الخاصة بهم (نوع من SQL) ، ونوع من لغات الواجهة الأمامية ، مثل HTML ، CSS ، JS ، إلخ ...

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

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

طريق المصباح:

  • إنشاء استعلام (سلسلة) ؛
  • استخدم عبارات MySQLI المعدة واسترداد البيانات في صفيف.

طريق orm:

  • قم بتشغيل وظيفة تحصل على الكيان
  • الذي يدير استعلام MySQL
  • قم بتشغيل وظيفة أخرى تضيف شرطية
  • قم بتشغيل وظيفة أخرى تضيف شرطية أخرى
  • تشغيل وظيفة أخرى تنضم
  • قم بتشغيل وظيفة أخرى تضيف الشرطية على الانضمام
  • قم بتشغيل وظيفة أخرى تستعد
  • يدير استعلام MySQL آخر
  • قم بتشغيل وظيفة أخرى تجلب البيانات
  • يدير استعلام MySQL آخر

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

يحاول Orms حل مشكلة معقدة للغاية. هناك حالات الحافة الوطنية والمقايضات الرئيسية للتصميم مع عدم وجود حلول واضحة أو واضحة. عند تحسين تصميم ORM للموقف A ، فإنك تجعله محرجًا بطبيعته لحل الموقف B.

هناك OrMs يتعامل مع التحميل البطيء والحلول الفرعية بطريقة "جيدة بما يكفي" ، ولكن يكاد يكون من المستحيل الوصول من "جيد بما فيه الكفاية" إلى "رائع".

عند تصميم ORM الخاص بك ، يجب أن يكون لديك مقبض جيد جدًا على جميع تصميمات قاعدة البيانات المحرجة المحتملة ، ومن المتوقع أن يتم التعامل مع ORM. عليك أن تصنع مفاضلات حول المواقف التي ترغب في التعامل معها بشكل محرج.

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

حظا سعيدا إعادة اختراع العجلة.

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