PostgreSQL: البدء مع PostgreSQL

PostgreSQL هو أقوى قاعدة بيانات علائقية مفتوحة المصدر في العالم. يشتهر بموثوقيته وقابليته للتوسع وامتثاله للمعايير، وتثق به شركات عالمية رائدة مثل Apple وInstagram وSpotify.

1. ما ستتعلمه


2. قصة حقيقية لمطور شامل

(1) المشكلة: اختيار قاعدة البيانات مربك

Alice هي مطورة شاملة تعمل في شركة تطلق مشروعًا جديدًا للتجارة الإلكترونية. في اجتماع اختيار التقنية، تجادل الفريق بين MySQL وPostgreSQL:

كانت بحاجة إلى مقارنة موضوعية وشاملة لاتخاذ القرار.

(2) حل PostgreSQL

يغطي PostgreSQL معظم احتياجات الأعمال بقاعدة بيانات واحدة — من الاستعلامات العلائقية التقليدية إلى تخزين مستندات JSON، ومن البحث النصي الكامل إلى البحث المتجهي — دون وسيط إضافي:

SQL
-- PostgreSQL: قاعدة بيانات واحدة لحالات استخدام متعددة

-- 1. استعلام علائقي تقليدي
SELECT u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.name;

-- 2. تخزين JSONB المرن (لا حاجة لـ MongoDB)
INSERT INTO products (name, attributes)
VALUES ('Running Shoes', '{"color": "red", "size": 42, "tags": ["sport", "outdoor"]}'::jsonb);

-- 3. البحث النصي الكامل (لا حاجة لـ Elasticsearch)
SELECT name FROM products
WHERE to_tsvector('english', name) @@ to_tsquery('english', 'running & shoes');

(3) النتيجة

أدركت Alice أن اختيار PostgreSQL يعني:


3. ما هي قاعدة البيانات

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

(1) قواعد البيانات العلائقية مقابل غير العلائقية

البعد علائقية (RDBMS) غير علائقية (NoSQL)
نموذج البيانات جداول (صفوف + أعمدة)، هيكل صارم مستند / مفتاح-قيمة / رسم بياني / عمود عريض، هيكل مرن
لغة الاستعلام SQL (موحدة) واجهات برمجة خاصة
المعاملات ACID تناسق قوي غالبًا تناسق نهائي فقط
أمثلة PostgreSQL، MySQL، Oracle MongoDB، Redis، Cassandra
حالات الاستخدام استعلامات معقدة، معالجة معاملات، احتياجات تناسق عالية إنتاجية عالية، هيكل مرن، تكرار سريع
التوسع غالبًا رأسي غالبًا أفقي
100%
graph TB
    DB[قاعدة البيانات] --> RDBMS[قاعدة علائقية<br/>SQL + ACID]
    DB --> NoSQL[NoSQL<br/>هيكل مرن]
    RDBMS --> PG[PostgreSQL]
    RDBMS --> MY[MySQL]
    RDBMS --> OR[Oracle]
    NoSQL --> MGO[MongoDB<br/>مستند]
    NoSQL --> RED[Redis<br/>مفتاح-قيمة]
    NoSQL --> CAS[Cassandra<br/>عمود عريض]
💡 نصيحة: PostgreSQL هو قاعدة بيانات علائقية، لكن نوع JSONB الخاص به يسمح بتخزين هياكل مرنة مثل قاعدة بيانات المستندات — لهذا يُطلق على PG "قاعدة بيانات واحدة تحل محل ثلاثة."


4. تاريخ PostgreSQL

(1) من POSTGRES إلى PostgreSQL

100%
graph LR
    A["1986<br/>مشروع POSTGRES<br/>جامعة كاليفورنيا بيركلي"] --> B["1995<br/>Postgres95<br/>إضافة دعم SQL"]
    B --> C["1996<br/>PostgreSQL 6.0<br/>إصدار مفتوح المصدر"]
    C --> D["عقد 2010<br/>JSONB / CTE / دوال<br/>النوافذ / FDW"]
    D --> E["2024<br/>PostgreSQL 17<br/>الإصدار الحالي طويل الدعم"]
السنة الإنجاز الأهمية
1986 إطلاق مشروع POSTGRES بدأه Michael Stonebraker في جامعة كاليفورنيا بيركلي، مستوحى من Ingres
1995 إصدار Postgres95 إضافة دعم لغة SQL (استبدال لغة الاستعلام PostQUEL)
1996 PostgreSQL 6.0 إعادة تسمية رسمية إلى PostgreSQL، إصدار مفتوح المصدر
2005 الإصدار 8.0 دعم أصلي لـ Windows، نقاط حفظ، إيداع ثنائي المرحلة
2012 الإصدار 9.2 دعم JSON (تمت ترقيته إلى JSONB في 9.4)، أنواع النطاق
2016 الإصدار 9.6 استعلامات متوازية، بحث نصي كامل بالعبارات
2017 الإصدار 10.0 تقسيم تصريحي، نسخ متماثل منطقي، مصادقة SCRAM
2022 الإصدار 15.0 أمر MERGE (UPSERT بمعيار SQL)
2024 الإصدار 17.0 الإصدار الحالي طويل الدعم، نسخ متماثل منطقي محسن، معيار SQL/JSON كامل

(2) فلسفة تصميم PostgreSQL

يمكن تلخيص فلسفة التصميم الأساسية لـ PostgreSQL في أربع كلمات:

المبدأ يتجسد في
الامتثال للمعايير يتبع بصرامة معيار SQL (SQL:2023)، يدعم معظم الميزات القياسية
القابلية للتوسع يدعم الأنواع المخصصة والدوال وطرق الفهرسة واللغات الإجرائية (عبر Extensions)
الموثوقية معاملات ACID، تحكم التزامن MVCC، سجل الكتابة المسبقة WAL — البيانات لا تضيع افتراضيًا
مدفوع بالمجتمع لا تتحكم به شركة واحدة؛ أكثر من 1000 مساهم عالمي؛ مفتوح المصدر حقًا
📌 نقطة رئيسية: PostgreSQL ليس "PostgreSQL الخاص بأي شخص" — تتم صيانته من قبل مجموعة تطوير PostgreSQL العالمية ولا تتحكم به أي شركة واحدة. هذا على النقيض تمامًا من MySQL (التي تتحكم بها Oracle).


5. PostgreSQL مقابل MySQL

هذا أكثر ما اهتمت به Alice وفريقها. إليك مقارنة موضوعية عبر عدة أبعاد:

البعد PostgreSQL MySQL
المعمارية نموذج العمليات (عملية لكل اتصال) نموذج الخيوط (خيط لكل اتصال)
التزامن MVCC (تحكم التزامن متعدد الإصدارات)؛ القراءة والكتابة لا تحجب بعضها أساسًا أقفال الجدول؛ InnoDB أقفال صفوف لكن نطاق محدود
معيار SQL يتبع بصرامة SQL:2023 يتبع جزئيًا؛ العديد من الصيغ الخاصة بـ MySQL
دعم JSON JSONB (تخزين ثنائي، استعلامات مفهرسة سريعة جدًا) JSON (تخزين نصي، ميزات محدودة)
البحث النصي الكامل tsvector/tsquery مدمج، دعم متعدد اللغات فهرس FULLTEXT، ميزات أساسية
أنواع الفهارس 6 أنواع (B-Tree / GIN / GiST / BRIN / SP-GiST / Hash) 3 أنواع (B-Tree / Hash / Fulltext)
نظام الإضافات CREATE EXTENSION يثبت الميزات بخطوة واحدة (pgvector / PostGIS، إلخ) لا توجد آلية مكافئة
التقسيم تقسيم تصريحي (RANGE / LIST / HASH، PG 10+) جداول مقسمة (8.0+)، صيغة أكثر إسهابًا
النسخ المتماثل نسخ متدفق + نسخ منطقي (نسخ لكل جدول) نسخ رئيسي-تابع (المثيل بالكامل)
النسخ الاحتياطي PITR استعادة لنقطة زمنية (حتى الثانية) إعادة تشغيل binlog (أقل دقة)
الترخيص رخصة PostgreSQL (مشابهة لـ BSD، متساهلة جدًا) GPL (قيود تجارية)
الاستعلامات المعقدة دوال النوافذ / CTE تكراري / LATERAL JOIN مدعومة أصلاً مدعومة من 8.0+ لكن أضعف من PG
العمليات خيارات تكوين كثيرة، مساحة ضبط كبيرة يعمل مباشرة، عمليات أبسط
الحصة السوقية أسرع قاعدة بيانات نموًا على DB-Engines لمدة 7 سنوات متتالية أكبر قاعدة تثبيت عالمية

(1) ▶ مثال

SQL
-- PostgreSQL: INSERT ON CONFLICT (أكثر مرونة)
INSERT INTO users (email, name)
VALUES ('alice@example.com', 'Alice')
ON CONFLICT (email)
DO UPDATE SET name = EXCLUDED.name, updated_at = NOW()
RETURNING id, name, updated_at;
-- عبارة RETURNING تعيد الصف المتأثر (MySQL ليس لديها مكافئ)

Output:

TEXT 📖 للعرض فقط
INSERT 0 1
SQL
-- MySQL: ON DUPLICATE KEY UPDATE (أقل مرونة)
INSERT INTO users (email, name)
VALUES ('alice@example.com', 'Alice')
ON DUPLICATE KEY UPDATE name = VALUES(name), updated_at = NOW();
-- لا توجد عبارة RETURNING، يجب تشغيل SELECT منفصل للحصول على النتيجة

(2) ▶ مثال

SQL
-- PostgreSQL: JSONB مع فهرس GIN (استعلامات مفهرسة سريعة)
SELECT name FROM products
WHERE attributes @> '{"color": "red"}'::jsonb;
-- @> هو عامل "يحتوي"، يستخدم فهرس GIN

Output:

TEXT 📖 للعرض فقط
 id | name     | value 
----+----------+-------
  1 | example  | 42
(1 row)
SQL
-- MySQL: دالة JSON (لا دعم فهرس لهذا النمط)
SELECT name FROM products
WHERE JSON_CONTAINS(attributes, '"red"', '$.color');
-- لا فهرس، مسح كامل للجدول

(3) ▶ مثال

SQL
-- PostgreSQL: بحث نصي كامل مدمج مع ترتيب
SELECT name, ts_rank(to_tsvector('english', name || ' ' || description),
                     to_tsquery('english', 'red & shoes')) AS rank
FROM products
WHERE to_tsvector('english', name || ' ' || description)
      @@ to_tsquery('english', 'red & shoes')
ORDER BY rank DESC;

Output:

TEXT 📖 للعرض فقط
 id | name     | value 
----+----------+-------
  1 | example  | 42
(1 row)
SQL
-- MySQL: بحث FULLTEXT أساسي (لا مرونة في الترتيب)
SELECT name FROM products
WHERE MATCH(name, description) AGAINST('red shoes' IN BOOLEAN MODE);
⚠️ ملاحظة: MySQL أسهل في التعلم للسيناريوهات البسيطة (CRUD جدول واحد، مشاريع صغيرة). قوة PostgreSQL تكمن في الاستعلامات المعقدة وسلامة البيانات والميزات المتقدمة. اختر بناءً على احتياجات المشروع، وليس الضجة الإعلامية.


6. نقاط قوة PostgreSQL الأساسية

(1) معاملات ACID

ACID هي مجموعة الخصائص الأربع التي تضمن موثوقية البيانات:

الخاصية الاسم الكامل المعنى تنفيذ PostgreSQL
A Atomicity (الذرية) الكل أو لا شيء: المعاملة إما تنجح بالكامل أو تتراجع بالكامل سجل WAL للكتابة المسبقة
C Consistency (التناسق) تبقى قاعدة البيانات في حالة صالحة قبل وبعد المعاملة القيود / المشغلات / فحوصات الأنواع
I Isolation (العزل) المعاملات المتزامنة لا تتداخل مع بعضها MVCC تحكم التزامن متعدد الإصدارات
D Durability (الديمومة) البيانات المؤكدة لا تضيع أبدًا WAL + fsync

(2) MVCC تحكم التزامن متعدد الإصدارات

MVCC هو جوهر تزامن PostgreSQL. القراءة لا تحجب الكتابة، والكتابة لا تحجب القراءة:

السيناريو MySQL (InnoDB) PostgreSQL (MVCC)
تزامن القراءة والكتابة أقفال مشتركة/حصرية، احتمال الحجب القراء يرون لقطة؛ الكتّاب ينشئون إصدارات جديدة — لا حجب
تأثير المعاملات الطويلة تحجب المعاملات الأخرى لا حجب؛ فقط الإصدارات القديمة تُحتفظ بها
القراءة المتسقة تحتاج MVCC لكن معقد التنفيذ عزل لقطة طبيعي

(3) القابلية للتوسع

آلية الإضافات في PostgreSQL (CREATE EXTENSION) هي أكبر ميزة في نظامه البيئي:

الإضافة الوظيفة تستبدل الوسيط
pgvector البحث المتجهي / تضمينات الذكاء الاصطناعي Pinecone / Weaviate
PostGIS استعلامات جغرافية مكانية MongoDB Geo
pg_trgm بحث تقريبي Elasticsearch
pgcrypto دوال التشفير تشفير طبقة التطبيق
uuid-ossp توليد UUID توليد طبقة التطبيق
postgres_fdw استعلامات عبر قواعد البيانات أدوات ETL

(4) ▶ مثال

SQL
-- التحقق من الإضافات المتاحة
SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE name IN ('uuid-ossp', 'pg_trgm', 'pgcrypto');

-- تثبيت إضافة
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- استخدام الإضافة لتوليد UUID
SELECT uuid_generate_v4();
-- الناتج: UUID فريد مثل 550e8400-e29b-41d4-a716-446655440000

Output:

TEXT 📖 للعرض فقط
CREATE TABLE

(5) ▶ مثال

SQL
-- PostgreSQL: عبارة FILTER للتجميع الشرطي (معيار SQL)
SELECT
    store_id,
    COUNT(*) AS total_orders,
    COUNT(*) FILTER (WHERE status = 'completed') AS completed_orders,
    COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled_orders
FROM orders
GROUP BY store_id;

Output:

TEXT 📖 للعرض فقط
 count 
-------
     5
(1 row)
SQL
-- MySQL: يجب استخدام حل بديل SUM(IF()) أو SUM(CASE)
SELECT
    store_id,
    COUNT(*) AS total_orders,
    SUM(IF(status = 'completed', 1, 0)) AS completed_orders,
    SUM(IF(status = 'cancelled', 1, 0)) AS cancelled_orders
FROM orders
GROUP BY store_id;

7. حالات الاستخدام الشائعة لـ PostgreSQL

السيناريو ميزة PG مثال
التجارة الإلكترونية سمات منتج JSONB + بحث نصي كامل + تقسيم سمات SKU ديناميكية، بحث منتجات، طلبات مقسمة شهريًا
SaaS متعدد المستأجرين RLS أمان مستوى الصف + عزل المخطط قاعدة بيانات واحدة تخدم مستأجرين متعددين، سياسات مستوى الصف تعزل البيانات
تحليلات البيانات دوال النوافذ + طرق عرض مادية + CTE تحليل احتفاظ المستخدمين، تقارير اتجاهات المبيعات، إحصائيات معقدة
الذكاء الاصطناعي / التوصيات pgvector بحث متجهي تشابه المنتجات، بحث دلالي، تطبيقات RAG
خدمات GIS إضافة PostGIS تطبيقات الخرائط، حساب المسافات، تخطيط المسارات
المالية ACID + عزل 3 مستويات + PITR تحويلات، تسوية، استعادة لنقطة زمنية
إدارة المحتوى بحث نصي كامل + JSONB بحث مقالات، إدارة الوسوم، محتوى مرن

(6) ▶ مثال

SQL
-- المنتجات المختلفة لها سمات مختلفة
-- لا حاجة لجداول أو أعمدة منفصلة لكل نوع سمة

INSERT INTO products (name, price, attributes) VALUES
    ('Running Shoes', 89.99, '{"color": "red", "size": 42, "weight_grams": 280}'::jsonb),
    ('Laptop', 1299.00, '{"cpu": "M3", "ram_gb": 16, "screen_inch": 14}'::jsonb),
    ('Coffee Beans', 24.50, '{"origin": "Colombia", "roast": "medium", "weight_kg": 1}'::jsonb);

-- استعلام: ابحث عن جميع المنتجات الحمراء تحت 100 دولار
SELECT name, price, attributes
FROM products
WHERE price < 100
  AND attributes @> '{"color": "red"}'::jsonb;

Output:

TEXT 📖 للعرض فقط
     name      | price  |                 attributes
---------------+--------+--------------------------------------------
 Running Shoes |  89.99 | {"color": "red", "size": 42, "weight_grams": 280}

8. مثال كامل: تدفق قرار اختيار قاعدة البيانات

SQL
-- ============================================
-- مثال شامل: عرض ميزات PostgreSQL
-- يوضح لماذا يمكن لقاعدة بيانات PG واحدة استبدال أدوات متعددة
-- ============================================

-- 1. معاملة ACID (لا حاجة لتناسق على مستوى التطبيق)
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;

-- 2. تخزين JSONB (لا حاجة لـ MongoDB)
INSERT INTO products (name, attributes)
VALUES ('Smart Watch', '{"color": "black", "battery_life_hours": 48, "waterproof": true}'::jsonb);

-- 3. بحث نصي كامل (لا حاجة لـ Elasticsearch)
SELECT name, ts_rank(
    to_tsvector('english', name),
    plainto_tsquery('english', 'smart watch')
) AS relevance
FROM products
WHERE to_tsvector('english', name) @@ plainto_tsquery('english', 'smart watch')
ORDER BY relevance DESC;

-- 4. دالة نافذة (لا حاجة لترتيب على مستوى التطبيق)
SELECT name, price,
    RANK() OVER (ORDER BY price DESC) AS price_rank
FROM products;

-- 5. UPSERT (لا حاجة لمعالجة تعارض على مستوى التطبيق)
INSERT INTO products (name, price, attributes)
VALUES ('Smart Watch', 199.99, '{"color": "black", "battery_life_hours": 48}'::jsonb)
ON CONFLICT (name)
DO UPDATE SET price = EXCLUDED.price,
              attributes = EXCLUDED.attributes
RETURNING id, name, price;

Output (excerpt):

TEXT 📖 للعرض فقط
 -- مخرجات UPSERT RETURNING:
 id |    name     | price
----+-------------+--------
  1 | Smart Watch | 199.99

❓ أسئلة شائعة

س هل PostgreSQL مجاني بالكامل؟ هل يوجد أي ترخيص تجاري خفي؟
ج يستخدم PostgreSQL رخصة PostgreSQL (مشابهة لـ BSD)، لذا يمكنك استخدامه وتعديله وتوزيعه بحرية — بما في ذلك الاستخدام التجاري — بدون رسوم خفية. إنه أكثر تساهلاً من GPL الخاص بـ MySQL: لست مضطرًا حتى لفتح كود مصدر تطبيقك.
س هل PostgreSQL مناسب للمشاريع الصغيرة؟ أليس ثقيلاً جدًا؟
ج يعمل تثبيت PostgreSQL الأدنى بحوالي 50 ميجابايت من الذاكرة. للمشاريع الصغيرة، يعمل وضع التكوين الصفري في PG مباشرة. مقارنة بـ MySQL، إعدادات PG الافتراضية آمنة وموثوقة بالفعل — لن تشعر المشاريع الصغيرة بأنه "ثقيل جدًا."
س هل يجب أن أختار PostgreSQL أم MySQL؟
ج اختر PostgreSQL إذا كان مشروعك يحتاج استعلامات معقدة أو JSONB أو بحث نصي كامل أو GIS أو كتابات عالية التزامن. MySQL جيد إذا كان مشروعك CRUD بسيطًا أو فريقك يعرف MySQL فقط أو تحتاج أقصى أداء قراءة. منذ 2024، نسبة المشاريع الجديدة التي تختار PostgreSQL في ارتفاع مستمر.
س هل الترحيل من MySQL إلى PostgreSQL صعب؟
ج للمشاريع الصغيرة والمتوسطة، يستغرق الترحيل حوالي 1–2 أسبوع. معظم العمل هو اختلافات صيغة SQL (مثلاً، backticks → علامات تنصيص مزدوجة، AUTO_INCREMENT → SERIAL/IDENTITY). للأدوات، يمكن لـ pgLoader ترحيل البيانات والهيكل تلقائيًا.
س هل PostgreSQL أسرع حقًا من MySQL؟
ج في سيناريوهات OLTP (قراءة/كتابة بسيطة)، الاثنان متقاربان. في الكتابات عالية التزامن وJOIN المعقدة ودوال النوافذ واستعلامات JSONB، يتفوق PostgreSQL بوضوح على MySQL. MVCC في PG يمنع القراءة والكتابة من حجب بعضهما — هذه هي الميزة الأساسية.
س هل أحتاج لتعلم MySQL قبل PostgreSQL؟
ج لا. SQL في PostgreSQL أقرب إلى SQL القياسي، لذا تعلم PG أولاً أفضل في الواقع. بمجرد أن تعرف PG، ستشعر أن MySQL سهل (لأن PG يعلمك صيغًا أكثر قياسية).

📖 ملخص


📝 تمارين

  1. أساسي (★): اذكر 3 ميزات تجعل PostgreSQL فريدًا مقارنة بـ MySQL (ميزات تفتقر إليها MySQL أو أضعف فيها بشكل كبير)، واشرح فائدة كل منها في جملة واحدة.

  2. متوسط (★★): افترض أنك تختار قاعدة بيانات لمنصة تعليم عبر الإنترنت تحتاج لتخزين معلومات الدورات (منظمة) وملاحظات الطلاب (غير منظمة)، بالإضافة إلى البحث في محتوى الدورات. اكتب سبب اختيارك لـ PostgreSQL أو MySQL، مستشهدًا بـ 3 ميزات تقنية على الأقل لدعم حجتك.

  3. تحدي (★★★): اقرأ صفحة "Feature Matrix" في وثائق PostgreSQL (ابحث عن "PostgreSQL Feature Matrix") وابحث عن 3 ميزات لـ PG لم تُذكر في هذا الدرس، موضحًا ما الأداة الخارجية أو الوسيط الذي يمكن لكل منها استبداله.

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%