مقدمة
عندما تبدأ في تعلم Backend باستخدام Python، ستتعامل بسرعة مع مشكلة أساسية: أين سنخزن البيانات؟
تخيل أنك تبني متجرًا إلكترونيًا. لديك مستخدمون، منتجات، طلبات، أسعار، عناوين، عمليات دفع وغيرها من البيانات.
لا يمكنك الاعتماد على متغيرات Python فقط لتخزين هذه المعلومات، لأن البيانات ستختفي بمجرد توقف البرنامج.
قاعدة البيانات هي المكان المنظم الذي يخزن فيه التطبيق البيانات بحيث يمكن حفظها واسترجاعها وتعديلها وحذفها بطريقة آمنة ومنظمة.
ما هي قاعدة البيانات؟
قاعدة البيانات Database هي نظام يسمح بتخزين البيانات وتنظيمها وإدارتها واسترجاعها عند الحاجة.
في تطبيق Backend يمكن أن تحتوي قاعدة البيانات على معلومات مثل:
- المستخدمين.
- المنتجات.
- الطلبات.
- التعليقات.
- الرسائل.
- بيانات تسجيل الدخول.
الجداول Tables
في قواعد البيانات العلائقية Relational Databases يتم تنظيم البيانات غالبًا داخل جداول.
تخيل جدولًا باسم
users
يحتوي على المستخدمين:
id | name | email
---+------------+-------------------
1 | محمد | mohammed@example.com
2 | أحمد | ahmed@example.com
3 | علي | ali@example.com
كل صف يمثل سجلًا Record وكل عمود يمثل خاصية Column.
Rows و Columns
لفهم الجداول بشكل بسيط:
- Table: الجدول بالكامل.
- Row: سجل واحد.
- Column: نوع معين من البيانات.
- Cell: قيمة واحدة داخل الجدول.
مثال:
users
id | name | age
---+-------+----
1 | محمد | 25
2 | علي | 30
السطر الأول يمثل مستخدمًا،
وعمود
name
يحتوي اسم المستخدم.
المفتاح الأساسي Primary Key
الـ Primary Key هو معرف فريد لكل سجل داخل الجدول.
غالبًا نستخدم عمودًا باسم
id.
id | name
---+------
1 | محمد
2 | أحمد
3 | علي
هنا كل مستخدم لديه
id
مختلف.
لأنه يسمح لنا بتحديد سجل معين بسهولة دون الاعتماد على الاسم أو البريد الإلكتروني فقط.
المفتاح الخارجي Foreign Key
الـ Foreign Key يستخدم لربط جدول بجدول آخر.
مثلًا لدينا:
users
id | name
---+-------
1 | محمد
2 | أحمد
ولدينا جدول للطلبات:
orders
id | user_id | total
---+---------+------
1 | 1 | 100
2 | 1 | 250
3 | 2 | 80
هنا
user_id
يحدد المستخدم الذي يملك الطلب.
العلاقات بين الجداول
العلاقات من أهم المفاهيم التي يجب أن يفهمها مطور Backend.
One To One
سجل واحد يرتبط بسجل واحد.
مثال: مستخدم ← ملف شخصي.
One To Many
سجل واحد يمكن أن يرتبط بعدة سجلات.
مثال: مستخدم واحد يمكن أن يمتلك عدة طلبات.
Many To Many
عدة سجلات يمكن أن ترتبط بعدة سجلات.
مثال: الطلاب والمواد الدراسية.
ما هي SQL؟
لغة SQL تستخدم للتعامل مع قواعد البيانات العلائقية.
من خلالها يمكننا تنفيذ عمليات مثل:
- إنشاء الجداول.
- إضافة البيانات.
- قراءة البيانات.
- تعديل البيانات.
- حذف البيانات.
قراءة البيانات باستخدام SELECT
SELECT * FROM users;
هذا الاستعلام يقوم بجلب جميع البيانات
من جدول
users.
ويمكن تحديد أعمدة معينة:
SELECT name, email
FROM users;
استخدام WHERE
إذا أردنا الحصول على مستخدم معين،
يمكن استخدام
WHERE.
SELECT *
FROM users
WHERE id = 1;
هنا نطلب من قاعدة البيانات إرجاع المستخدم الذي يحمل الرقم 1.
إضافة البيانات INSERT
INSERT INTO users (name, email)
VALUES ('محمد', 'mohammed@example.com');
يستخدم
INSERT
لإضافة سجل جديد.
تعديل البيانات UPDATE
UPDATE users
SET name = 'محمد جميل'
WHERE id = 1;
هذا الاستعلام يعدل اسم المستخدم الذي رقمه 1.
استخدام
UPDATE
أو
DELETE
بدون
WHERE
قد يؤدي إلى تعديل أو حذف عدد كبير
من السجلات.
حذف البيانات DELETE
DELETE FROM users
WHERE id = 1;
يقوم هذا الاستعلام بحذف المستخدم الذي رقمه 1.
أنواع قواعد البيانات
توجد أنواع متعددة من قواعد البيانات، ومن المهم أن تعرف الفرق بينها.
Relational Databases
تعتمد على الجداول والعلاقات بينها.
أمثلة:
- PostgreSQL
- MySQL
- MariaDB
- SQLite
NoSQL Databases
تستخدم نماذج مختلفة عن الجداول العلائقية التقليدية.
من أشهر الأمثلة:
- MongoDB
- Redis
لماذا PostgreSQL؟
يعد PostgreSQL خيارًا قويًا جدًا لمشاريع Backend الحديثة.
لأنه يوفر:
- دعمًا قويًا للـ SQL.
- العلاقات بين الجداول.
- Transactions.
- قيود البيانات Constraints.
- أداءً جيدًا.
- ميزات متقدمة للمشاريع الكبيرة.
ما هو ORM؟
الـ ORM اختصار لـ Object Relational Mapping.
فكرته أنه يسمح لك بالتعامل مع قاعدة البيانات باستخدام كائنات ولغة البرمجة بدل كتابة SQL في كل مرة.
في Django نستخدم Django ORM.
Database Models في Django
يمكننا تعريف نموذج مستخدم بسيط داخل Django:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(
max_digits=10,
decimal_places=2
)
created_at = models.DateTimeField(
auto_now_add=True
)
Django سيقوم بتحويل هذا النموذج إلى جدول في قاعدة البيانات بعد تنفيذ الـ migrations.
ما هي Migrations؟
الـ Migrations تستخدم لإدارة التغييرات التي تحدث في بنية قاعدة البيانات من خلال نماذج Django.
بعد إنشاء أو تعديل Model يمكن تنفيذ:
python manage.py makemigrations
python manage.py migrate
الأمر الأول ينشئ ملفات migration، والأمر الثاني يطبق التغييرات على قاعدة البيانات.
QuerySet
الـ QuerySet هو طريقة Django للتعامل مع مجموعة من البيانات الموجودة في قاعدة البيانات.
products = Product.objects.all()
للحصول على منتج معين:
product = Product.objects.get(id=1)
ويمكن استخدام:
products = Product.objects.filter(
price__gte=100
)
للحصول على المنتجات التي سعرها أكبر من أو يساوي 100.
ما هي Indexes؟
الـ Index يساعد قاعدة البيانات على العثور على البيانات بشكل أسرع في بعض أنواع الاستعلامات.
فكر فيها مثل فهرس الكتاب. بدل قراءة الكتاب كاملًا للعثور على موضوع معين، تستخدم الفهرس للوصول إليه بسرعة أكبر.
الـ Index ليس شيئًا يجب إضافته إلى كل عمود بشكل عشوائي؛ له تكلفة إضافية في التخزين وعمليات الكتابة، لذلك يجب استخدامه بناءً على الاستعلامات الفعلية.
Transactions
الـ Transaction تسمح بتنفيذ مجموعة من العمليات كوحدة واحدة.
مثال من متجر إلكتروني:
- إنشاء الطلب.
- تقليل كمية المنتج.
- تسجيل عملية الدفع.
إذا فشلت إحدى العمليات، فقد نحتاج إلى التراجع عن العمليات السابقة بدل ترك قاعدة البيانات في حالة غير صحيحة.
في Django يمكن استخدام:
from django.db import transaction
with transaction.atomic():
# عمليات قاعدة البيانات
pass
Database Normalization
التطبيع Normalization هو مجموعة من المبادئ التي تساعد على تنظيم البيانات وتقليل التكرار والمشاكل الناتجة عنه.
بدل وضع كل المعلومات داخل جدول ضخم، يمكن تقسيم البيانات إلى جداول منطقية مرتبطة ببعضها.
مثال:
- Users
- Products
- Orders
- Order Items
أمان قواعد البيانات
مطور Backend يجب أن يهتم بأمان البيانات منذ بداية المشروع.
- عدم تخزين كلمات المرور كنص عادي.
- استخدام hashing لكلمات المرور.
- عدم وضع بيانات قاعدة البيانات الحساسة داخل الكود مباشرة.
- استخدام Environment Variables للإعدادات الحساسة.
- تجنب SQL Injection.
- إعطاء المستخدم أقل صلاحيات ممكنة.
مشكلة N+1 Query
من المشاكل الشائعة في تطبيقات Backend تنفيذ عدد كبير من الاستعلامات بدون حاجة.
مثلًا: لديك 100 طلب، ولكل طلب مستخدم. إذا قمت بجلب الطلبات ثم نفذت استعلامًا منفصلًا لكل مستخدم، فقد تحصل على عدد كبير من الاستعلامات.
في Django توجد أدوات مثل:
select_related()
prefetch_related()
تساعد هذه الأدوات في تحسين بعض سيناريوهات جلب العلاقات وتقليل الاستعلامات غير الضرورية.
النسخ الاحتياطي Backup
قاعدة البيانات تحتوي على معلومات قد تكون مهمة جدًا، لذلك يجب التفكير في النسخ الاحتياطي.
في المشاريع الحقيقية يجب أن يكون لديك استراتيجية واضحة لاستعادة البيانات عند حدوث مشكلة.
- نسخ احتياطية دورية.
- تخزين آمن للنسخ.
- اختبار عملية الاستعادة.
- تحديد مدة الاحتفاظ بالنسخ.
كيف يتعامل Backend مع قاعدة البيانات؟
يمكن تصور دورة الطلب بالشكل التالي:
- المستخدم يرسل Request.
- الـ URL يوجه الطلب إلى View.
- الـ View أو Service ينفذ منطق العمل.
- يتم إرسال Query إلى قاعدة البيانات.
- قاعدة البيانات تعيد البيانات.
- Backend يعالج البيانات.
- يتم إرسال Response للمستخدم.
ممارسات مهمة لمطور Backend
- تعلم SQL حتى لو كنت تستخدم ORM.
- افهم العلاقات بين الجداول.
- تعلم أساسيات Indexes.
- افهم Transactions.
- راقب أداء الاستعلامات.
- لا تكرر البيانات بدون سبب.
- اهتم بالنسخ الاحتياطي.
- لا تضع كلمات المرور والمفاتيح السرية داخل Git.
مشروع عملي للتدريب
بعد فهم الأساسيات، حاول بناء مشروع بسيط مثل نظام إدارة متجر.
أنشئ الجداول التالية:
- Users
- Products
- Categories
- Orders
- OrderItems
ثم حاول تنفيذ العمليات التالية:
- إنشاء مستخدم.
- إضافة منتج.
- إنشاء طلب.
- إضافة منتجات إلى الطلب.
- حساب إجمالي الطلب.
- جلب طلبات مستخدم معين.
لا تكتفِ بقراءة SQL أو Django ORM. اكتب الاستعلامات بنفسك وابنِ مشروعًا صغيرًا، لأن فهم قواعد البيانات يتحسن بشكل كبير من خلال الممارسة.
أخطاء شائعة عند تعلم قواعد البيانات
- الاعتماد على ORM دون فهم SQL.
- إنشاء جداول ضخمة بدون تصميم واضح.
- تجاهل العلاقات بين البيانات.
- إضافة Indexes بشكل عشوائي.
- عدم التفكير في Transactions.
- تخزين كلمات المرور بطريقة غير آمنة.
- عدم وجود نسخ احتياطية.
- تجاهل أداء الاستعلامات.
الخلاصة
قواعد البيانات ليست مجرد مكان نخزن فيه المعلومات، بل هي جزء أساسي من هندسة تطبيقات Backend.
كمطور Python Backend، من المهم أن تفهم:
- الجداول والسجلات والأعمدة.
- Primary Keys و Foreign Keys.
- العلاقات بين الجداول.
- أساسيات SQL.
- PostgreSQL.
- Django ORM.
- Migrations و QuerySets.
- Indexes و Transactions.
- أمان البيانات والنسخ الاحتياطي.
وبعد إتقان هذه المفاهيم، ستصبح قادرًا على بناء تطبيقات Backend أكثر تنظيمًا وقابلية للتوسع.