متى نكتب الكود داخل قاعدة البيانات؟
كمطورة باك إند، أحياناً يكون من الأفضل تنفيذ المنطق البرمجي (Logic) داخل قاعدة البيانات مباشرة بدلاً من كتابته في كود الموقع (PHP, Node.js, etc). هنا نلجأ لاستخدام الـ Stored Procedures والـ Functions.
كلاهما عبارة عن "مجموعة أوامر SQL" مخزنة مسبقاً، لكن الفرق بينهما يشبه الفرق بين "الموظف الذي يقوم بمهمة كاملة" و"الآلة الحاسبة التي تعطيكِ نتيجة فورية". دعونا نفكك هذا اللبس الشائع.
أولاً: الـ Stored Procedure (الموظف الشامل)
هو إجراء مخزن يمكنه القيام بعمليات معقدة وتغيير حالة البيانات بشكل كبير.
-
الهدف: تنفيذ سلسلة من الخطوات (مثل: إنشاء مستخدم، ثم إرسال تنبيه، ثم تحديث جدول الإحصائيات).
-
الإرجاع: يمكنه إرجاع قيم متعددة (عبر برامترات OUT) أو لا يرجع شيئاً على الإطلاق.
-
الاستدعاء: يتم استدعاؤه باستخدام كلمة
CALL. -
المرونة: يمكنكِ استخدامه لإجراء عمليات
INSERT,UPDATE,DELETE.
ثانياً: الـ Function (الآلة الحاسبة)
هي وظيفة مصممة لغرض واحد فقط: حساب قيمة معينة وإرجاعها فوراً.
-
الهدف: القيام بعملية حسابية أو معالجة نصية وإرجاع نتيجة واحدة (مثل: حساب الضريبة، أو تحويل التاريخ لصيغة معينة).
-
الإرجاع: يجب أن ترجع قيمة واحدة فقط باستخدام كلمة
RETURN. -
الاستدعاء: يتم استدعاؤها مباشرة داخل أوامر SQL (مثلاً:
SELECT my_function(price) FROM orders;). -
القيود: لا يمكنها (في أغلب الحالات) تغيير البيانات في الجداول (مثل عمل UPDATE)؛ فهي مصممة للقراءة والحساب فقط.
مقارنة تفصيلية: Procedure vs Function
| وجه المقارنة | Stored Procedure | Function |
| القيمة المرجعة | اختيارية (صفر أو أكثر) | إجبارية (قيمة واحدة فقط) |
| طريقة الاستدعاء | باستخدام أمر CALL |
تُستخدم داخل SELECT أو WHERE |
| تغيير البيانات | مسموح (DML operations) | غير مسموح (للحساب فقط غالباً) |
| البرامترات | تدعم IN, OUT, INOUT | تدعم IN فقط |
| التعامل مع Transactions | يمكنها عمل Commit و Rollback | لا يمكنها ذلك |
ثالثاً: متى تستخدمين كل منهما؟
-
استخدمي Stored Procedure عندما:
-
تريدين تنفيذ عملية "بزنس" معقدة تشمل أكثر من جدول.
-
تريدين تقليل حجم البيانات المنتقلة بين السيرفر وقاعدة البيانات (عن طريق تنفيذ المنطق محلياً).
-
تحتاجين لعمليات "حذف" أو "تعديل" ضخمة بناءً على شروط متغيرة.
-
-
استخدمي Function عندما:
-
تريدين تبسيط كود الـ
SELECTالخاص بكِ (مثل دالة تحول العملة). -
لديكِ عملية حسابية تتكرر كثيراً في استعلاماتك.
-
تريدين شيئاً يمكن استخدامه بسهولة داخل جمل الـ
JOINأو الـORDER BY.
-
الخلاصة
الـ Procedure هو "أداة تنفيذية" للمهام الكبيرة، بينما الـ Function هي "أداة حسابية" ذكية. التوظيف الصحيح لكل منهما يجعل قاعدة بياناتك أسرع، وكود الموقع الخاص بكِ أنظف وأسهل في الصيانة.
والسؤال لكِ الآن: ❌ هل ما زلتِ تضعين المنطق الحسابي المعقد داخل كود الـ PHP/Node.js؟ 👉 أم ستبدأين في نقل هذه الحسابات إلى قاعدة البيانات لتوفير موارد السيرفر؟
الأسئلة الشائعة (FAQ)
-
س1: هل يمكن استدعاء Function من داخل Procedure؟
-
ج: نعم، يمكنكِ استخدام الـ Functions داخل الـ Procedures بكل سهولة.
-
-
س2: هل يمكن استدعاء Procedure من داخل Function؟
-
ج: لا، هذا غير مسموح به في MySQL لأن الـ Function يجب ألا تؤثر على حالة البيانات (No Side Effects).
-
-
س3: أيهما أسرع في الأداء؟
-
ج: كلاهما سريع لأنهما مخزنان بشكل مترجم (Pre-compiled)، لكن الـ Function قد تكون أبطأ إذا استُخدمت بشكل خاطئ داخل استعلام
SELECTعلى ملايين الصفوف.
-
-
س4: هل الـ Procedure يحمي من الـ SQL Injection؟
-
ج: نعم، لأنه يستخدم البرامترات (Parameters) بشكل يعزل البيانات عن الأوامر، مما يجعله وسيلة أمان ممتازة.
-
-
س5: هل يمكنني إرجاع "جدول كامل" من Function؟
-
ج: في MySQL التقليدية لا، الـ Function ترجع قيمة Scalar (نص، رقم، تاريخ).
-