PostgreSQL vs MongoDB
PostgreSQL بطل قواعد البيانات العلائقية مفتوحة المصدر، مقابل MongoDB قاعدة بيانات NoSQL المرنة القائمة على المستندات. كيف تختار قاعدة البيانات المناسبة وفقًا لنموذج بياناتك؟
قاعدة بيانات علائقية مفتوحة المصدر تعمل على خادمك الخاص، تنضج منذ عام 1986
منصة خلفية (backend) مُدارة ومفتوحة المصدر، مبنية على PostgreSQL حقيقي
هذا القرار ليس له إجابة واحدة صحيحة. إذا كنت فريقًا صغيرًا وأولويتك السرعة، فإن Supabase هو الخيار الصحيح: المصادقة والتخزين والوقت الفعلي وتجميع الاتصالات جاهزة. ومع حمل قابل للتنبؤ، أو قيد على موقع البيانات (تركيا ليست ضمن المناطق الـ17)، أو تكلفة تتضاعف مع عدد المستخدمين، يفوز PostgreSQL ذاتي الاستضافة. تحذير واحد: التوثيق الرسمي يذكر أن النسخ الاحتياطي وPITR المُدارين يتوقفان عند الاستضافة الذاتية — ومع التحكم ترث اختبار الاسترجاع. أخذ نسخة احتياطية ليس هو المعيار؛ القدرة على العودة هي المعيار.
| الفئة | Self-hosted PostgreSQL | Supabase |
|---|---|---|
| الأداء | 8/10 | 8/10 |
| سهولة التعلّم | 5/10 | 8/10 |
| النظام البيئي | 9/10 | 8/10 |
| المجتمع | 9/10 | 9/10 |
| سوق العمل | 8/10 | 7/10 |
| الاستدامة المستقبلية | 8/10 | 8/10 |
# PostgreSQL الذاتي الاستضافة - إعداد أرشفة WAL مع PITR (postgresql.conf)
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /var/backups/pg_wal_archive/%f && cp %p /var/backups/pg_wal_archive/%f'
max_wal_senders = 3
# أخذ نسخة احتياطية أساسية (pg_basebackup)
pg_basebackup -D /var/backups/base -Ft -z -P -U replicator -h localhost
# PITR: العودة إلى وقت محدد (recovery.signal + postgresql.conf)
# 1) فك ضغط النسخة الاحتياطية الأساسية في مجلد الاسترجاع
# 2) أضف الأسطر التالية إلى postgresql.conf، وأنشئ ملف recovery.signal
restore_command = 'cp /var/backups/pg_wal_archive/%f %p'
recovery_target_time = '2026-09-23 09:00:00+03'
# pg_hba.conf - الاتصال يُسمح به فقط من خادم التطبيق
host appdb app_user 10.0.0.5/32 scram-sha-256
-- SQL (psql): تثبيت إضافة (حرية كاملة - خاصة بالاستضافة الذاتية)
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS pg_cron;
# تجميع الاتصالات (PgBouncer, pgbouncer.ini)
[databases]
appdb = host=127.0.0.1 port=5432 dbname=appdb
[pgbouncer]
pool_mode = transaction
max_client_conn = 500
default_pool_size = 25-- SQL (Supabase SQL Editor): 1) إنشاء الجدول وتفعيل RLS (يفرضه Data API)
create table public.notes (
id uuid default gen_random_uuid() primary key,
user_id uuid references auth.users not null,
content text not null,
created_at timestamptz default now()
);
alter table public.notes enable row level security;
create policy "المستخدمون يقرؤون ملاحظاتهم الخاصة"
on public.notes for select
using (auth.uid() = user_id);
create policy "المستخدمون يكتبون ملاحظاتهم الخاصة"
on public.notes for insert
with check (auth.uid() = user_id);
// 2) استعلام عبر supabase-js (يُطبَّق RLS تلقائيًا)
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_ANON_KEY!
)
const { data: notes, error } = await supabase
.from('notes')
.select('id, content, created_at')
.order('created_at', { ascending: false })
// 3) سلاسل الاتصال عبر عميل Postgres (وفق جدول "Endpoints and IP versions" الرسمي)
// Direct connection (خلفية دائمة، pg_dump، الترحيل):
// postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres
// Dedicated pooler (وضع transaction فقط، في الخطط المدفوعة):
// postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:6543/postgres
// إعداد السلسلة يدويًا: انسخها من شاشة Dashboard > Connect (لا يمكن اشتقاق مضيف shared pooler من المنطقة).هذا القرار ليس له إجابة واحدة صحيحة. إذا كنت فريقًا صغيرًا وأولويتك السرعة، فإن Supabase هو الخيار الصحيح: المصادقة والتخزين والوقت الفعلي وتجميع الاتصالات جاهزة. ومع حمل قابل للتنبؤ، أو قيد على موقع البيانات (تركيا ليست ضمن المناطق الـ17)، أو تكلفة تتضاعف مع عدد المستخدمين، يفوز PostgreSQL ذاتي الاستضافة. تحذير واحد: التوثيق الرسمي يذكر أن النسخ الاحتياطي وPITR المُدارين يتوقفان عند الاستضافة الذاتية — ومع التحكم ترث اختبار الاسترجاع. أخذ نسخة احتياطية ليس هو المعيار؛ القدرة على العودة هي المعيار.
احصل على استشارة مجانيةبما أن Supabase يستخدم PostgreSQL قياسيًا، يمكنك التصدير عبر `pg_dump`/`pg_dumpall` أو عبر تكرار (replication) Postgres الأصلي؛ ويشرح التوثيق الرسمي النقل بين المشاريع بمثال سكربت Node.js (يشمل المصادقة والتخزين). أما إعادة بناء خدمات Supabase الخاصة مثل المصادقة والتخزين والوقت الفعلي على جانب الاستضافة الذاتية (عبر تشغيل حزمة الاستضافة الذاتية الرسمية بـDocker Compose) فهو عمل منفصل — نقل البيانات وبناء تكافؤ الخدمات خطوتان مختلفتان.