الجداول والمخطط
يحمل الجدول نوعاً واحداً من الأشياء — منتجات أو طلبات أو رسائل أو فواتير. كل عمود قطعة معلومات عن ذلك الشيء (سعر أو تاريخ أو معرّف مستخدم). ضبط المخطط بشكل صحيح من البداية يوفّر ألماً لاحقاً.
إنشاء جدول
افتح تبويب Database
في لوحة تحكم مشروعك، انقر Database في الشريط الجانبي.
انقر New Table
أعطِ الجدول اسماً بصيغة الجمع وبالأحرف الصغيرة — products و orders و messages. التزم بـ snake_case.
أضف أعمدة
يزرع المحرر مفتاحاً أساسياً id من نوع uuid. أضف ما تحتاجه أيضاً — بما فيها طوابع created_at / updated_at، التي تضيفها بنفسك (راجع الطوابع الزمنية أدناه).
احفظ
يُنشأ الجدول فوراً. يمكنك إضافة أعمدة أو إزالتها لاحقاً.

أو اطلب من ذكائك الاصطناعي
يمكن لعميل الذكاء الاصطناعي إنشاء الجداول وتعديلها لك عبر MCP — يشغّل تغييرات المخطط كهجرات (apply_migration) فتُطبَّق بأمان. صف الجدول بلغة بسيطة ودعه يكتب SQL.
أنواع الأعمدة
يغطي محدّد الأنواع في المحرر البصري أكثر أنواع PostgreSQL شيوعاً. التي ستصل إليها أكثر:
| النوع | استخدمه لـ | مثال |
|---|---|---|
text | الأسماء والأوصاف وأي سلسلة | "Blue cotton t-shirt" |
varchar(n) | سلاسل بحد أقصى صارم للطول | varchar(50) لاسم مستخدم |
integer / bigint / smallint | العدّ والأرقام الصغيرة والمعرّفات | 42 |
numeric(10,2) | المال والكسور الدقيقة | 199.99 |
double precision / real | كسور تقريبية (فيزياء وتحليلات) | 3.14159 |
boolean | أعلام نعم/لا | is_active و email_verified |
timestamptz / timestamp | تواريخ + أوقات (مع / دون منطقة زمنية) | 2026-04-16 10:30:00+00 |
date / time | تاريخ فقط / وقت فقط | 2026-04-16 |
uuid | معرّفات فريدة عالمياً | 550e8400-e29b-41d4-... |
jsonb / json | بيانات متداخلة أو مرنة | {"color": "red", "size": "M"} |
bytea | ثنائي خام | (كتل صغيرة) |
المصفوفات SQL فقط
أنواع المصفوفات مثل text[] صالحة في PostgreSQL وتعمل جيداً، لكنها ليست في محدّد الأنواع البصري — أضفها عبر محرر SQL (أو اطلب من ذكائك الاصطناعي). كل ما في الجدول أعلاه متاح في المحرر البصري.
عند الشك، فضّل text على varchar
يبدو varchar(n) أكثر أماناً لكن text مطابق في الأداء ولا ينكسر عندما تحتاج ذلك الحرف الإضافي. استخدم varchar فقط عندما يكون الحد الأقصى للطول قاعدة أعمال حقيقية.
المفاتيح الأساسية
استخدم uuid مع قيمة افتراضية. عشوائي وآمن من التصادم ولا يسرّب معلومات عدد الصفوف:
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
استخدم bigserial (عدد صحيح يتزايد تلقائياً) فقط عندما تحتاج فعلاً ترتيباً أو عناوين URL أقصر. لمعظم التطبيقات، UUID هو الجواب الصحيح.
الطوابع الزمنية
يجب أن يكون لكل جدول هذان العمودان:
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
يزرع المحرر البصري المفتاح الأساسي id لكن ليس الطوابع الزمنية — أضف created_at / updated_at بنفسك (في محدّد الأعمدة أو عبر SQL). ستحتاجها للتصحيح والترتيب ومسارات التدقيق لاحقاً، لذا يستحق إضافتها على كل جدول.
لإبقاء updated_at حديثاً، إما حدّثه في سير عملك (SET updated_at = now()) أو أضف محفّزاً. معظم التطبيقات تحدّثه في سير العمل — أبسط.
⚠️ مراجع المستخدمين: استخدم TEXT لا UUID
هذا هو الخطأ رقم 1 الذي يرتكبه الناس. يستخدم نظام مصادقة DYPAI معرّفاً من 32 حرفاً (وليس UUID)، لذا أي عمود يشير إلى مستخدم يجب أن يكون TEXT.
صحيح
CREATE TABLE public.tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL REFERENCES system.users(id) ON DELETE CASCADE,
title TEXT NOT NULL,
done BOOLEAN NOT NULL DEFAULT false,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
خطأ (سينهار وقت التشغيل)
-- ❌ Don't do this
user_id UUID REFERENCES system.users(id)
عندما يحاول endpoint WHERE user_id = ${current_user_id}، سيفشل Postgres بـ:
invalid input syntax for type uuid: "G1LIBXsbMLxUrs99ebCaL9X4auxW26AC"
قاعدة عامة: أي عمود يربط صفاً بمستخدم = TEXT. المفاتيح الأجنبية الأخرى (product_id → products.id و order_id → orders.id) تبقي UUID الطبيعي.
في العناصر النائبة لسير العمل
اكتب WHERE user_id = ${current_user_id} — دون علامات اقتباس، دون تحويل ::uuid. يربط المحرك المعامل بالنوع الصحيح تلقائياً.
الفهارس
أضف فهرساً لأي عمود تصفّي أو ترتّب به كثيراً. للمحرر البصري لوحة Indexes منفصلة لكل جدول:

أنماط شائعة:
- فهرس كل مفتاح أجنبي (
user_idوproduct_idوغيرها) — تصفّي معظم الاستعلامات بها - فهرس
created_at DESCإذا سردت العناصر الحديثة - تخطَّ الفهارس على الجداول الصغيرة (أقل من ~1k صف) — Postgres سريع بما يكفي دونها
الفهارس تكلّف عند الكتابة
كل فهرس يجعل الإدراج والتحديث أبطأ قليلاً. أضفها عندما تكون الاستعلامات بطيئة، لا استباقياً.
مثال: جدول tasks منمذج جيداً
هكذا يبدو جدول نموذجي يملكه المستخدم مع كل الاصطلاحات مطبّقة:
CREATE TABLE public.tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL REFERENCES system.users(id) ON DELETE CASCADE,
title TEXT NOT NULL,
description TEXT,
done BOOLEAN NOT NULL DEFAULT false,
due_date DATE,
priority INT NOT NULL DEFAULT 0,
tags TEXT[] NOT NULL DEFAULT '{}',
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_tasks_user_id ON public.tasks(user_id);
CREATE INDEX idx_tasks_created_at ON public.tasks(created_at DESC);
انسخ هذا كنقطة انطلاق عندما تبني أي شيء ينتمي إلى مستخدم.