PostgreSQL: البدء مع PostgreSQL
PostgreSQL هو أقوى قاعدة بيانات علائقية مفتوحة المصدر في العالم. يشتهر بموثوقيته وقابليته للتوسع وامتثاله للمعايير، وتثق به شركات عالمية رائدة مثل Apple وInstagram وSpotify.
1. ما ستتعلمه
- ما هي قاعدة البيانات، والفرق بين القواعد العلائقية وغير العلائقية
- تاريخ PostgreSQL وفلسفة تصميمه
- PostgreSQL مقابل MySQL: الفروق الرئيسية
- نقاط قوة PostgreSQL الأساسية (ACID / MVCC / القابلية للتوسع / JSONB / البحث النصي الكامل)
- حالات الاستخدام الشائعة لـ PostgreSQL
2. قصة حقيقية لمطور شامل
(1) المشكلة: اختيار قاعدة البيانات مربك
Alice هي مطورة شاملة تعمل في شركة تطلق مشروعًا جديدًا للتجارة الإلكترونية. في اجتماع اختيار التقنية، تجادل الفريق بين MySQL وPostgreSQL:
- أصر البعض على MySQL: "لطالما استخدمنا MySQL — لا داعي للتغيير."
- أوصى آخرون بـ PostgreSQL: "PG يدعم JSONB والبحث النصي الكامل ودوال النوافذ — أقوى بكثير من MySQL."
- احتارت Alice: ما هو الفرق الجوهري بين الاثنين؟ إذا اختاروا بشكل خاطئ، هل ستكون تكلفة الترحيل عالية لاحقًا؟
كانت بحاجة إلى مقارنة موضوعية وشاملة لاتخاذ القرار.
(2) حل PostgreSQL
يغطي PostgreSQL معظم احتياجات الأعمال بقاعدة بيانات واحدة — من الاستعلامات العلائقية التقليدية إلى تخزين مستندات JSON، ومن البحث النصي الكامل إلى البحث المتجهي — دون وسيط إضافي:
-- 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 يعني:
- صيانة مكونات وسيطة أقل بـ 2–3 (لا حاجة لـ MongoDB / Elasticsearch / طبقة تخزين Redis المؤقت)
- كفاءة تطوير أعلى: JSONB + البحث النصي الكامل + دوال النوافذ تحل الاحتياجات المعقدة في عبارة SQL واحدة
- تكلفة أقل على المدى الطويل: PostgreSQL مفتوح المصدر بالكامل ومجاني، بدون رسوم ترخيص
3. ما هي قاعدة البيانات
قاعدة البيانات هي نظام ينظم ويخزن ويدير البيانات بطريقة منظمة. بدون قاعدة بيانات، لا يمكن لبيانات التطبيق أن توجد إلا في الذاكرة — وتختفي لحظة إغلاق البرنامج.
(1) قواعد البيانات العلائقية مقابل غير العلائقية
| البعد | علائقية (RDBMS) | غير علائقية (NoSQL) |
|---|---|---|
| نموذج البيانات | جداول (صفوف + أعمدة)، هيكل صارم | مستند / مفتاح-قيمة / رسم بياني / عمود عريض، هيكل مرن |
| لغة الاستعلام | SQL (موحدة) | واجهات برمجة خاصة |
| المعاملات | ACID تناسق قوي | غالبًا تناسق نهائي فقط |
| أمثلة | PostgreSQL، MySQL، Oracle | MongoDB، Redis، Cassandra |
| حالات الاستخدام | استعلامات معقدة، معالجة معاملات، احتياجات تناسق عالية | إنتاجية عالية، هيكل مرن، تكرار سريع |
| التوسع | غالبًا رأسي | غالبًا أفقي |
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/>عمود عريض]
4. تاريخ PostgreSQL
(1) من POSTGRES إلى PostgreSQL
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 مساهم عالمي؛ مفتوح المصدر حقًا |
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) ▶ مثال
-- 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:
INSERT 0 1
-- 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) ▶ مثال
-- PostgreSQL: JSONB مع فهرس GIN (استعلامات مفهرسة سريعة)
SELECT name FROM products
WHERE attributes @> '{"color": "red"}'::jsonb;
-- @> هو عامل "يحتوي"، يستخدم فهرس GIN
Output:
id | name | value
----+----------+-------
1 | example | 42
(1 row)
-- MySQL: دالة JSON (لا دعم فهرس لهذا النمط)
SELECT name FROM products
WHERE JSON_CONTAINS(attributes, '"red"', '$.color');
-- لا فهرس، مسح كامل للجدول
(3) ▶ مثال
-- 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:
id | name | value
----+----------+-------
1 | example | 42
(1 row)
-- MySQL: بحث FULLTEXT أساسي (لا مرونة في الترتيب)
SELECT name FROM products
WHERE MATCH(name, description) AGAINST('red shoes' IN BOOLEAN MODE);
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) ▶ مثال
-- التحقق من الإضافات المتاحة
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:
CREATE TABLE
(5) ▶ مثال
-- 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:
count
-------
5
(1 row)
-- 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) ▶ مثال
-- المنتجات المختلفة لها سمات مختلفة
-- لا حاجة لجداول أو أعمدة منفصلة لكل نوع سمة
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:
name | price | attributes
---------------+--------+--------------------------------------------
Running Shoes | 89.99 | {"color": "red", "size": 42, "weight_grams": 280}
8. مثال كامل: تدفق قرار اختيار قاعدة البيانات
-- ============================================
-- مثال شامل: عرض ميزات 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):
-- مخرجات UPSERT RETURNING:
id | name | price
----+-------------+--------
1 | Smart Watch | 199.99
❓ أسئلة شائعة
📖 ملخص
- PostgreSQL هو أقوى قاعدة بيانات علائقية مفتوحة المصدر في العالم ويتبع معيار SQL بصرامة
- تطور PG من POSTGRES في 1986 إلى PostgreSQL 17 في 2024، متحسنًا باستمرار
- PG مقابل MySQL: يتفوق PG في الاستعلامات المعقدة وJSONB والبحث النصي الكامل ونظام الإضافات وسلامة البيانات؛ MySQL يفوز في السيناريوهات البسيطة والبساطة التشغيلية
- نقاط قوة PG الأساسية: معاملات ACID، تحكم التزامن MVCC، آلية الإضافات، JSONB، والبحث النصي الكامل
- يمكن لقاعدة بيانات PG واحدة استبدال عدة مكونات وسيطة (MongoDB + Elasticsearch + Redis)، مما يقلل التعقيد التشغيلي
- حالات استخدام PG: التجارة الإلكترونية، SaaS، تحليلات البيانات، توصيات الذكاء الاصطناعي، GIS، المالية، إدارة المحتوى
📝 تمارين
-
أساسي (★): اذكر 3 ميزات تجعل PostgreSQL فريدًا مقارنة بـ MySQL (ميزات تفتقر إليها MySQL أو أضعف فيها بشكل كبير)، واشرح فائدة كل منها في جملة واحدة.
-
متوسط (★★): افترض أنك تختار قاعدة بيانات لمنصة تعليم عبر الإنترنت تحتاج لتخزين معلومات الدورات (منظمة) وملاحظات الطلاب (غير منظمة)، بالإضافة إلى البحث في محتوى الدورات. اكتب سبب اختيارك لـ PostgreSQL أو MySQL، مستشهدًا بـ 3 ميزات تقنية على الأقل لدعم حجتك.
-
تحدي (★★★): اقرأ صفحة "Feature Matrix" في وثائق PostgreSQL (ابحث عن "PostgreSQL Feature Matrix") وابحث عن 3 ميزات لـ PG لم تُذكر في هذا الدرس، موضحًا ما الأداة الخارجية أو الوسيط الذي يمكن لكل منها استبداله.