ورقة وقلم وتعالوا نتكلم عن واحدة من أهم المفاهيم في عالم صناعة البرمجيات واللي مبسطة علينا حياتنا اليومية كمبرمجين  ألا وهي الـ ORMs - Object Relational Mappers.


هنتكلم النهارده عن هي ايه و مميزاتها وعيوبها, ولكن خلونا نتفق إن شكل العناصر في عالم قاعدة البيانات مختلف عن عالم ال Backend ففي قواعد البيانات غالبًا بنتكلم في جداول وصفوف من البيانات في حالة الـ SQL أو البيانات تكون محطوطة في Blobs or Documents في حالة ال NoSQL 

بينما أثناء تصميم و كتابة ال Backend غالبًا بننظم البيانات ونتعامل معها على هيئة Objects ومش شرط كل البيانات في صف ما في ال Database  مثلاً تكون في Object واحد في الكود والعكس صحيح.

فلو بنحتفظ ببيانات الطالب في قاعدة البيانات هتكون على شكل صف أو عدد من الصفوف في جداول مختلفة ولكن في الكود البيانات دي علي شكل Object و بعد ما نستعيد البيانات من ال Database ب SQL Query لازم نعمل Mapping بين الاثنين بشكل يدوي! 

ولو كتبنا Pseudocode للعملية دي هتكون كدا:

StudentSql =  ‘select * from student where studentId=1
studentData = db.query(StudentSql)
Student studentObject = new Student()
studentObject.setID(studentData[0])
studentObject.setName(studentData[1])

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

وهنا تيجي ال ORM وهي طريقة Mapping بين البيانات في قاعدة البيانات والـ Code, ال ORM بتكون مكتبة Library قادرة تفهم الكود و قاعدة البيانات وتعمل هي الـ Mapping دا بدل ما نضطر نعمله بشكل يدوي.

فال Pseudocode بتاعنا هيتحول للشكل البسيط دا 

Student = dbORM.queryStudent(studentID=1)

وكل دا بإني بعرف Data Model أو Schema لل ORM وهي بتبتدي تتعامل مع ال Database  بنفسها لتكوين وطلب البيانات منها.

Object Relational Mappers
Object Relational Mappers

مميزات ال ORM

  • بنبعد عن كتابة ال Raw SQL وبالتالي بنقلل الأخطاء اللي ممكن تحصل لو المبرمج مش متمكن من ال SQL زي لغة البرمجة اللي بيستخدمها في الكود ,وبالتالي معامل أمان أكبر تجاه الأخطاء والهجمات زي ال SQL Injections 
  • بتوفر وقت كتير ومجهود كان هيضيع في عملية الـ Mapping بشكل يدوي
  • بتعمل Abstraction لل Database Layer وبكدا اقدر اغير ال Database Solution اللي معتمد عليه من غير ما أغير أي حاجة في الكود لأن ال Data Model ثابت.
  • بتستختدم مبادئ ال OOP ومميزاتها وبالتالي الكود بيكون أحسن وأكثر تنظيمًا 

عيوب ال ORM

لا شيء يـأتي بلا ثمن ولذلك:

  •  هتحتاج تتعلم إزاي تكتب كود بال ORM Library المتناسبة مع لغة البرمجة اللي بتستخدمها 
  • النوع دا من المكتبات لا يعد Light Weight Library وبالتالي بيزود في حجم ال Package 
  • هتحتاج تعملها Configuration على المشروع الخاص بك 
  • أداء ال Complex Queries باستخدام ال ORM غالبًا هيكون أقل من كتابة Raw SQL Query

في الختام

الـ ORM قد ما بتوفر امكانيات جبارة في التعامل مع الـ Databases الا ان زي ما شوفنا ليها بعض العيوب , واختيارها من عدمه بيعتمد على عوامل كتير وبتفرق على حجم وطبيعة الـ Business اللي شغال عليه , ولكن من العيوب القاتلة ليها إن أحيانا ناس كتير بتعتمد عليها وبتكون شاطرة فيها ولكن بتبخس حق دراسة الـ Database والـ Internals وبالتالي لو قابلهم مشكلة في الـ Performance أو أي مشاكل تضطرهم لكتابة Raw SQL ممكن مايعرفوش يتصرفوا وقتها .. فقد ما الـ ORM مفيدة محتاجين منتجاهلش دراسة الـ Databases عشان تبقى اداة الـ ORM وقتها اداة قوية واحنا اللي بنتحكم فيها مش هي اللي بتتحكم فينا.