توسع هذه المقالة مقارنتين منشورتين بالفعل على هذه المدونة: مراجعتنا لتوافق PostgREST وبدائله ومقارنتنا المخصصة لطبقات GraphQL على Postgres. هنا تتغير الزاوية: شبكة قرار بين ثلاث طرق لبناء طبقة واجهة برمجة التطبيقات، مع معالجة Hasura لأذوناتها ونقاط امتداد الأعمال بدلاً من بناء جملة GraphQL الخاص بها، وواجهة برمجة تطبيقات مكتوبة بخط اليد كخيار في حد ذاتها، وليس سطر "آخر" بسيط في أسفل الجدول.
الأساسيات
- يُنشئ PostgREST واجهة برمجة تطبيقات REST تلقائيًا من مخطط Postgres - لا يوجد منطق عمل تعسفي ممكن، ويظل RLS هو الحد الأمني الوحيد.
- تضيف Hasura نظام الأذونات الخاص بها حسب الدور والجدول، والإجراءات لتوصيل خطاف الأعمال على الويب، ومشغلات الأحداث، ونقاط النهاية RESTified أعلى محرك GraphQL الخاص بها.
- توفر واجهة برمجة التطبيقات المخصصة (Node.js وExpress وFastify...) تحكمًا كاملاً في منطق الأعمال والتحقق من الصحة والمصادقة - على حساب كتابة كل شيء واختباره وصيانته بنفسك.
- في Aurabase، تعد طبقة PostgREST مثالًا حقيقيًا؛ يمر منطق الأعمال الذي يتجاوز CRUD عبر وظائف SQL المكشوفة في RPC أو من خلال Edge Functions، وليس من خلال خادم عقدة منفصل للاستضافة.
- لا تكون الأساليب الثلاثة حصرية بالضرورة: فالجمع بين PostgREST for CRUD وواجهة برمجة التطبيقات المخصصة للعمليات الحساسة هو نمط شائع في الإنتاج.
الاختيار الحقيقي: من يكتب منطق الأعمال، وأين
يخفي السؤال "PostgREST أو Hasura أو واجهة برمجة التطبيقات المخصصة" سؤالًا أكثر فائدة: من يكتب منطق عملك، وبأي أداة، ومن يستخدم هذا الرمز في الإنتاج؟ تستجيب البنى الثلاثة بشكل مختلف، وهذا الاختلاف يشكل كل شيء آخر – الأمان، وسرعة التنفيذ، والدين الفني على المدى الطويل.
| أصل واجهة برمجة التطبيقات | تم إنشاؤها من مخطط SQL | تم إنشاؤها من المخطط عبر محرك GraphQL Hasura | مكتوب الطريق عن طريق الطريق، باليد |
|---|---|---|---|
| منطق الأعمال المخصصة | وظائف SQL (RPC) فقط | الإجراءات (خطاف الويب) + مشغلات الحدث | أي كود، دون قيود الأداة |
| نموذج الأمان | RLS Postgres، الدور الذي يقوده JWT | أذونات خاصة بالدور/الجدول، وليس تفويضًا إلى RLS | ما الذي تقوم بتشفيره (البرامج الوسيطة، ORM، RLS الاختيارية) |
| لاستيعاب بالإضافة إلى ذلك | لا شيء — ثنائي خفيف الوزن | محرك Hasura، بقاعدة البيانات الوصفية الخاصة به | خادم التطبيق الكامل |
| منحنى التعلم | منخفض إذا كان الفريق يعرف بالفعل كيفية كتابة SQL | متوسط - أذونات ونظام تكوين جديد | لا شيء على الأداة، ولكن كل شيء آخر للتصميم |
| بوستجريست | حاسورة | واجهة برمجة التطبيقات المخصصة |
لا يوجد أي من الأعمدة الثلاثة أفضل بشكل صارم: فكل منها ينقل العمل إلى مكان آخر. يقوم PostgREST بنقله إلى SQL، وHasura إلى التكوين وخطافات الويب، وواجهة برمجة التطبيقات المخصصة إلى كود التطبيق الكلاسيكي.
PostgREST: واجهة برمجة التطبيقات (API) باعتبارها انعكاسًا مباشرًا للمخطط
يقوم PostgREST بتحويل مخطط Postgres الخاص بك إلى REST API - المرشحات، وتضمين العلاقات، وRPC، وRLS المدفوعة بواسطة JWT - بدون واجهة خلفية للكتابة. لقد قمنا بتفصيل هذا النطاق بعمق في مقالتنا حول توافقه الحقيقي مع وبدائله؛ ما يهم في هذه المقارنة هو أين يتوقف PostgREST.
ليس لدى PostgREST أي فكرة عن منطق العمل التعسفي. يجب التعبير عن كل قاعدة في SQL: وظيفة RPC، ومشغل، وقيد، وسياسة RLS. يعد هذا قيدًا مقبولاً، وليس سهوًا - يظل المخطط هو المصدر الوحيد للحقيقة، مما يزيل أي انحراف بين طبقة التطبيق والقاعدة التي تخدمها.
بشكل ملموس، من المستحيل الاتصال بخدمة دفع تابعة لجهة خارجية، أو إرسال رسالة تأكيد بالبريد الإلكتروني، أو حساب النتيجة في JavaScript من طلب PostgREST المباشر. يجب أن يكون هذا المنطق إما موجودًا في SQL (وظيفة pl/pgsql)، أو يتم تشغيله خارجًا - مشغل ينشر حدث NOTIFY، يتم الاستماع إليه بواسطة خدمة خارجية لم تعد PostgREST.
Hasura: تم الإعلان عن الأذونات، وتم تطعيم منطق الأعمال بواسطة خطاف الويب
مقالتنا عن طبقات GraphQL على Postgres توضح تفاصيل مكان تشغيل محرك Hasura وكيف تختلف أذوناته عن Postgres RLS. الزاوية هنا هي زاوية منطق الأعمال: كيفية توصيل تعليمات برمجية مخصصة بقاعدة بيانات تديرها Hasura، وأين.
يكشف الإجراء Hasura عن طفرة أو استعلام GraphQL مخصص، مدعومًا بخطاف ويب HTTP تكتبه باللغة التي تختارها. تقوم Hasura بالتحقق من صحة المدخلات وفقًا للمخطط المعلن، واستدعاء خطاف الويب الخاص بك، ثم إرجاع استجابتها إلى العميل. إنها البوابة إلى أي منطق يتجاوز CRUD: الاتصال بمزود الدفع، والحسابات المعقدة، والتنسيق متعدد الخطوات.
تتبع مشغلات الأحداث الاتجاه المعاكس: يؤدي الإدخال أو التحديث أو الحذف على الجدول إلى تشغيل خطاف ويب بشكل غير متزامن مع إعادة التشغيل التلقائي في حالة الفشل. هذه هي الآلية التي تستخدمها معظم عمليات تكامل Hasura لمزامنة خدمة جهة خارجية (الفوترة، البريد الإلكتروني للمعاملات، محرك البحث) دون ربط هذا الرمز بطلب العميل الأولي.
يمكن لـ Hasura أيضًا عرض استعلام GraphQL مكتوب بالفعل كمسار REST نموذجي، مع مسار مسمى ومعلمات - نقاط النهاية RESTifiedالخاصة به، في مصطلحات الوثائق الخاصة به. مفيد إذا كان فريق الواجهة الأمامية لديك يفضل استخدام REST، دون التخلي عن محرك أذونات GraphQL الأساسي.
أذونات Hasura هي نظام خاص بـ Hasura، لكل دور ولكل جدول، وليست تفويضًا إلى Postgres RLS. مكانان لتدقيق قواعد الوصول بدلاً من مكان واحد فقط - وهي تكلفة حقيقية يمكن مقارنتها بالمرونة المكتسبة من الإجراءات ومشغلات الأحداث.
تذكير بالسياق، تم تطويره في مقالتنا المخصصة: أعادت Hasura تركيز اتصالاتها على PromptQL، وهي طبقة مصممة لعملاء الذكاء الاصطناعي، منذ يونيو 2025 - دون إزالة محرك GraphQL الخاص بها، والذي لا يزال يتم تقديمه على أنه "تم اختباره في المعركة" على موقعها الرسمي على الويب.
واجهة برمجة التطبيقات المخصصة (Node.js، Express، Fastify): قم بتشفير كل شيء، والتحكم في كل شيء
ليس لواجهة برمجة التطبيقات (API) المكتوبة بخط اليد، بحكم التعريف، أي حدود: أي منطق عمل، بأي لغة، مع أي تبعيات. وهو أيضًا الخيار الوحيد من بين الخيارات الثلاثة التي لا يتم إنشاء أي شيء لك فيها - كل مسار، وكل عملية تحقق، وكل اتصال بقاعدة البيانات هو رمز تملكه ويجب عليك الحفاظ عليه.
ما يقدمه هذا النموذج، مقابل العمل اليدوي: التحكم الكامل في الأخطاء ورموز HTTP التي تم إرجاعها، وقابلية الاختبار الكلاسيكية (المعالجات، وليس التكوين التعريفي)، وعدم وجود DSL جديد للتعلم لفريق يتقن لغته بالفعل.
ما هي التكلفة في المقابل: CRUD، وترقيم الصفحات والمرشحات للكتابة والصيانة يدويًا لكل مورد؛ المصادقة والترخيص للتنفيذ والتدقيق بنفسك، دون RLS الموروثة تلقائيًا؛ خطر استعلامات N+1 إذا قامت كل علاقة متداخلة بتشغيل استعلام Postgres الخاص بها دون انضباط؛ ووثائق واجهة برمجة التطبيقات (API) التي يجب صيانتها يدويًا، أو عبر مولد تابع لجهة خارجية للتكامل.
On raw performance, the question “Is Node.js slower than Rust” is a topic in its own right — our article on Rust vs Node.js latency covers it in detail, with methodology declared upstream on our benchmark methodology page. A custom API has the same performance profile as any HTTP service you already use, neither better nor worse by construction. To know precisely where PostgREST saturates and at what point a custom layer becomes necessary, see our article on the real limits of PostgREST in production.
جدول المقارنة: الخيارات الثلاثة جنبًا إلى جنب
بعيدًا عن التصميم، غالبًا ما تظهر أربعة معايير عند الاختيار: سرعة التنفيذ، ومرونة العمل الحقيقية، والديون الفنية طويلة الأجل، وحالة الاستخدام النموذجية حيث يكون كل خيار أكثر راحة.
| الإعداد الأولي | دقائق — المخطط موجود بالفعل | ساعات — قم بتوصيل القاعدة وتكوين الأذونات | أيام إلى أسابيع — اكتب كل طريق |
|---|---|---|---|
| مرونة الأعمال | يقتصر على SQL (RPC، المشغلات) | جيدة عبر مشغلات الإجراءات/الأحداث، ولكنها تمر عبر خطاف ويب خارجي | إجمالي، واضح |
| مصطلح الديون الفنية | ضعيف - يظل الرسم البياني هو المصدر الوحيد للحقيقة | متوسط - بيانات تعريف Hasura التي يجب الحفاظ عليها بالإضافة إلى المخطط | عالية إذا كان الفريق ينمو دون انضباط (الاختبارات، التوثيق، المراجعة) |
| حالة الاستخدام النموذجي | قم بتوجيه CRUD على مخطط مستقر، فريق مريح في SQL | قم بتوحيد العديد من مصادر البيانات، أو المنطق الموجه نحو وكيل الذكاء الاصطناعي | منطق عمل معقد، والعديد من عمليات التكامل مع الجهات الخارجية |
| بوستجريست | حاسورة | واجهة برمجة التطبيقات المخصصة |
أين يذهب منطق الأعمال في مشروع Aurabase
في مشروع محرك Aurabase Postgres، تمت تغطية طبقة CRUD بالفعل بواسطة مثيل PostgREST الفعلي، وليس إعادة تنفيذ تقريبية. السؤال الذي يبقى مفتوحا أمام هذه المقارنة: أين نكتب ما يتجاوز CRUD؟
هناك طريقان، ولا ينفي أحدهما الآخر. الأول: عرض دالة SQL في RPC، لأي منطق يظل من المعقول التعبير عنه في SQL - حساب إجمالي، والتحقق المتبادل بين عدة جداول، والتحديثات المتتالية في معاملة واحدة.
الطريقة الثانية: وظائف الحافة، لكل ما يتجاوز مجال SQL - استدعاء واجهة برمجة تطبيقات الدفع، وإرسال بريد إلكتروني، وحساب التضمين. هناك مساران يؤديان إلى هناك في Aurabase: محرر الاستوديو، الذي يقوم بتشغيل كود Deno (TypeScript) تمامًا كما هو الحال في Supabase، وaura functions deployCLI، الذي يهدف إلى إنشاء مسار منفصل للوظائف المكتوبة بلغة Rust والمجمعة في WASM - المفصلة في بنية Rust الموحدة . لا يتطلب أي من المسارين استضافة خادم Node منفصل، على عكس خيار "واجهة برمجة التطبيقات المخصصة" النقي في هذه المقالة، حيث يكون هذا الخادم مسؤوليتك بالكامل.
لا يمثل هذا التوزيع حلاً وسطًا هشًا بين النماذج الثلاثة التي تمت مقارنتها هنا: فهو حرفيًا PostgREST لـ CRUD، وهو لبنة قريبة من Hasura Actions لمنطق الحدث عبر RPC والمشغلات، وEdge Functions التي تتجنب تشغيل خادم تطبيق كامل - دون فرض خيار ثنائي بين "All PostgREST" و"All Custom".
كيفية الاختيار وفقا للسياق الخاص بك
أربع حالات تظهر في أغلب الأحيان. يعتمد الاختيار الصحيح في الغالب على ما يتطلبه منطق عملك، وليس على شعبية الأداة.
- مخططك مستقر ومنطق عملك موجود في SQL. يكفي PostgREST المستضاف ذاتيًا، أو المدمج أصلاً (Aurabase، Supabase): لا شيء أكثر للاستضافة، ويظل المخطط هو المصدر الوحيد للحقيقة.
- إذا كنت ترغب في جمع عدة مصادر بيانات، أو أن خريطة الطريق الخاصة بك موجهة نحو عملاء الذكاء الاصطناعي الذين يستهلكون بياناتك. Hasura، بطبقة PromptQL، تناسب هذه التضاريس بشكل أفضل.
- يتمتع منتجك بمنطق عمل غني، والعديد من عمليات تكامل الجهات الخارجية، وفريق مجهز بالفعل بلغة تطبيق. تظل واجهة برمجة التطبيقات المخصصة هي الخيار الأكثر مباشرة، على حساب كتابتها وصيانتها بمرور الوقت.
- أنت تريد إنشاء CRUD ذاتيًا دون التخلي عن مساحة حقيقية لمنطق الأعمال (RPC، ووظائف الحافة)، دون تكديس خدمة تطبيق أخرى لاستغلالها. هذه هي الزاوية الموثقة في هذه المقارنة المطبقة على Aurabase، القسم السابق.