قيود قاعدة البيانات للتحقق من النماذج في تطبيقات بدون-كود
استخدم قيود قاعدة البيانات للتحقق من النماذج لوقف البيانات السيئة مبكرًا، عرض أخطاء واضحة، والحفاظ على اتساق تطبيقات no-code عبر الفرق.

لماذا تنتشر بيانات النموذج السيئة بسرعة
نادراً ما تبقى البيانات السيئة في مكان واحد. قيمة واحدة خاطئة مدخلة في نموذج يمكن أن تُنسخ، تُشير إليها أجزاء أخرى من التطبيق، وتُعتَمد من قبل كل جزء يتعامل معها.
غالبًا ما تبدأ صغيرًا: أحدهم يكتب بريدًا بإسافة زائدة في نهايته، يختار العميل الخطأ، أو يدخل كمية سالبة لأن الحقل يسمح بذلك. يقبل النموذج الإدخال، فيعامل النظام القيمة كما لو كانت صحيحة.
بعد ذلك، يتردد التأثير بسرعة. التقارير تظهر مجموعات خاطئة، الأتمتات تعمل على السجلات الخاطئة، ورسائل العملاء تسحب حقولًا فوضوية وتبدو غير مهنية. ثم تُنشئ الفرق حلولًا بديلة مثل جداول بيانات خاصة، مما يخلق عدم تطابق أكبر. والأسوأ من ذلك، أن نفس القيمة السيئة غالبًا ما تعود لاحقًا لأنها تظهر كخيار أو تُنسخ إلى سجلات جديدة.
إصلاح البيانات لاحقًا بطيء ومحفوف بالمخاطر لأن التنظيف نادرًا ما يكون عبارة عن تعديل واحد. عليك أن تجد كل مكان انتقلت إليه القيمة الخاطئة، تحدّث السجلات ذات الصلة، وتتحقق من كل ما يعتمد عليها. تصحيح "بسيط" واحد قد يكسر سير العمل، يسبب إشعارات مكررة، أو يشوّه تاريخ التدقيق.
فكرة استخدام قيود قاعدة البيانات للتحقق من النماذج هي إيقاف سلسلة التأثير هذه عند الخطوة الأولى. حين ترفض قاعدة البيانات بيانات مستحيلة أو متناقضة، تمنع الإخفاقات الصامتة وتعطيك لحظة واضحة لعرض تغذية راجعة مفيدة في واجهة المستخدم.
تخيّل نموذج طلب داخلي مبنيًا بأداة بدون-كود مثل AppMaster. إذا تم حفظ طلب مع رابط عميل مفقود أو رقم طلب مكرر، يمكن أن يلوث ذلك الفواتير، مهام الشحن، وتقارير الإيرادات. التقاطه عند وقت الإرسال يحافظ على نظافة كل ما يلي ويوفر عناء التنظيف لاحقًا.
قيود قاعدة البيانات، مُوضَّحة بلا مصطلحات معقّدة
قيود قاعدة البيانات هي قواعد بسيطة تعيش في قاعدة البيانات. تُنفَّذ في كل مرة تُحفظ فيها بيانات، بغض النظر عن مصدرها: نموذج ويب، شاشة جوال، استيراد، أو استدعاء API. إذا خالفت القاعدة، ترفض قاعدة البيانات الحفظ.
هذا هو الفرق الكبير عن التحقق في الواجهة فقط. يمكن للنموذج فحص الحقول قبل الضغط على حفظ، لكن تلك الفحوص سهلة التخطي أو التجاوز. شاشة أخرى قد تنسى نفس القاعدة. قد تكتب عملية آلية مباشرة إلى قاعدة البيانات. قريبًا ستحصل على بيانات تبدو سليمة في مكان وتكسر التقارير في مكان آخر.
عندما يتحدث الناس عن قيود قاعدة البيانات للتحقق من النماذج، فهم يقصدون هذا: دع قاعدة البيانات تكون الحكم النهائي، ودع الواجهة ترشد المستخدم بحيث نادراً ما يصطدم بتلك الحافة.
معظم التطبيقات الحقيقية تغطي الكثير بثلاث قواعد أساسية:
- Unique: "هذه القيمة يجب أن تكون فريدة." مثال: البريد الإلكتروني، رقم الموظف، رقم الفاتورة.
- Check: "يجب أن تكون هذه الحالة صحيحة." مثال: الكمية
> 0،start_date <= end_date. - Foreign key: "يجب أن تشير هذه القيمة إلى سجل حقيقي في جدول آخر." مثال: كل طلب يجب أن يشير إلى عميل موجود.
تكتسب القيود أهمية أكبر في تطبيقات بدون-كود لأنك عادةً تملك أكثر من طريق واحد لإنشاء أو تعديل البيانات. قد يكون لديك تطبيق ويب للمسؤولين، وتطبيق جوال للموظفين الميدانيين، وعمليات آلية تكتب السجلات في الخلفية. القيود تحافظ على اتساق كل هذه المسارات.
كما تجعل الأخطاء أوضح عندما تصمّم لها. بدلًا من ترك البيانات السيئة تتسلل ثم إصلاحها لاحقًا، يمكنك عرض رسالة مركزة مثل "رقم الفاتورة هذا موجود بالفعل" أو "يرجى اختيار عميل صالح" والحفاظ على قاعدة البيانات نظيفة منذ اليوم الأول.
من القيد إلى رسائل خطأ بشرية وواضحة
القيود رائعة في إيقاف البيانات السيئة، لكن أخطاء قاعدة البيانات الخام عادةً ما تكون موجهة للمطوّرين، لا للشخص الذي يملأ النموذج. الهدف بسيط: احتفظ بالقاعدة في قاعدة البيانات، ثم ترجم الفشل إلى رسالة تشرح ما حدث وماذا يفعل المستخدم بعد ذلك.
عامل كل قيد كـ"عقد خطأ" صغير مزدوج: ما الخطأ، وكيف أصلحه. هكذا تبقى واجهة المستخدم ودودة دون إضعاف قواعد البيانات.
بعض الترجمات التي تعمل جيدًا:
-
سيء: "Unique constraint violation on users_email_key"
-
جيد: "هذا البريد الإلكتروني مستخدم بالفعل. جرّب تسجيل الدخول أو استخدم بريدًا مختلفًا."
-
سيء: "Check constraint failed: order_total_positive"
-
جيد: "المجموع يجب أن يكون أكبر من 0. أضِف على الأقل عنصرًا واحدًا أو عدل الكمية."
-
سيء: "Foreign key violation on customer_id"
-
جيد: "اختر عميلًا صالحًا. إن كان جديدًا، أنشِئ العميل أولًا."
مكان عرض الرسالة مهم بقدر الكلمات. ضع خطأ الحقل بجانب الحقل نفسه. للقواعد عبر الحقول (مثل "يجب أن يكون تاريخ الانتهاء بعد تاريخ البدء"), غالبًا ما تكون لافتة على مستوى النموذج أوضح.
حافظ على مجموعة أنماط الرسائل صغيرة. نص داخل الحقل لمعظم المشاكل، لافتة صغيرة للقواعد عبر الحقول، وإشعار قصير للتأكيدات البسيطة عادةً يكفي.
ووفِّق الكلمات بين الويب والجوال. إن كانت واجهة الويب تقول "اختر عميلًا صالحًا" فلا ينبغي لتطبيق الجوال أن يقول "FK غير صالح". استخدم نفس الأفعال القصيرة ("اختر"، "أدخل"، "أزل") ونفس النبرة حتى يتعلم المستخدم ما يتوقعه.
إذا كنت تبني في AppMaster، فإن هذه الخريطة شيء تُصمّمه عن عمد: قاعدة البيانات تظل صارمة، بينما منطق الواجهة يحوّل الإخفاقات إلى إرشاد هادئ ومحدد.
خطوة بخطوة: بنِ القواعد أولًا، ثم النموذج
إذا صمّمت النموذج أولًا، ستجد نفسك تطارد حالات الحافة إلى الأبد. إذا صمّمت قواعد البيانات أولًا، تصبح الواجهة أبسط لأنها تعكس قواعد موجودة بالفعل في القاعدة.
ترتيب بناء عملي:
- دوّن الحقول القليلة المهمة فعلاً. عرّف ما يعنيه "صالح" بكلمات بسيطة. مثال: "البريد الإلكتروني يجب أن يكون فريدًا"، "الكمية يجب أن تكون 1 أو أكثر"، "كل طلب يجب أن ينتمي إلى عميل".
- نمذج الجداول والعلاقات. قرّر ما ينتمي إلى ماذا قبل رسم الشاشات.
- أضف القيود للقواعد غير القابلة للتفاوض. استخدم unique للتكرارات، check للقواعد التي يجب أن تبقى صحيحة دائمًا، والمفاتيح الخارجية للعلاقات.
- ابنِ واجهة المستخدم لتطابق القيود. علّم الحقول المطلوبة، استخدم أنواع إدخال مناسبة، وأضف تلميحات بسيطة. الواجهة ترشد الناس، لكن القاعدة تظل البوابة النهائية.
- حاول كسرها عمدًا. ألصق قيمًا فوضوية، حاول تكرارات، واختر سجلات مرتبطة مفقودة. ثم حسّن التسميات ونصوص الأخطاء حتى يصبح ما يجب إصلاحه واضحًا.
مثال سريع
لنفترض أنك تبني نموذج "طلب جديد" داخليًا. قد تتيح للمستخدم البحث باسم العميل، لكن قاعدة البيانات يجب أن تقبل فقط Customer ID حقيقي (مفتاح خارجي). في الواجهة، هذا يتحول إلى مُحدِّد قابل للبحث. إذا قدم المستخدم النموذج دون اختيار عميل، يمكن أن تقول الرسالة ببساطة "اختر عميلًا" بدلًا من فشل الحفظ لاحقًا برسالة مربكة.
هذا يحافظ على اتساق القواعد عبر الويب والجوال دون تكرار منطق هش في كل مكان.
قيود الفريدة التي تمنع التكرارات التي يصنعها الناس فعلاً
قيد الفريدة أبسط طريقة لإيقاف تراكم "نفس الشيء، إدخالات متعددة". يجعل القاعدة ترفض قيمة مكررة حتى لو فات النموذج ذلك.
استخدم unique للقيم التي يكررها الناس بطريق الخطأ طبيعيًا: بريد إلكتروني، اسم مستخدم، أرقام الفواتير، علامات الأصول، أرقام الموظفين، أو أرقام التذاكر الملصقة من جداول البيانات.
أول قرار هو النطاق. بعض القيم يجب أن تكون فريدة عبر النظام كله (اسم مستخدم). أخرى تحتاج أن تكون فريدة داخل مجموعة أصلية (رقم فاتورة لكل منظمة، أو علامة أصل لكل مستودع). اختَر النطاق عمدًا حتى لا تمنع بيانات صحيحة.
طريقة عملية للتفكير:
- فريدة عالمية: قيمة واحدة، سجل واحد في أي مكان (اسم مستخدم، معرف عام)
- فريدة داخل المنظمة: فريدة ضمن شركة/فريق (invoice_number + org_id)
- فريدة داخل الموقع: فريدة ضمن موقع (asset_tag + location_id)
طريقة التعامل مع التعارض مهمة بقدر القاعدة نفسها. عند فشل قيد الفريدة، لا تقل فقط "موجود بالفعل". قل ما تصادم وما يمكن للمستخدم فعله بعد ذلك. مثال: "رقم الفاتورة 1047 موجود بالفعل لشركة Acme Co. جرّب 1047-2، أو افتح الفاتورة الموجودة." إن كانت الواجهة قادرة على الإشارة للسجل الموجود بأمان، يمكن لمعلومة صغيرة مثل تاريخ الإنشاء أو المالك أن تساعد المستخدم على الاسترداد دون كشف تفاصيل حساسة.
التعديلات تحتاج عناية خاصة. خطأ شائع هو معاملة التعديل كسجل جديد وإشارة "تكرار" على نفسه. تأكد من أن منطق الحفظ يتعرف على السجل الحالي حتى لا يقارن الصف بنفسه.
في AppMaster، عرّف القاعدة الفريدة أولًا في Data Designer، ثم عكسها في النموذج برسالة ودودة. تبقى قاعدة البيانات الحاجز النهائي، وتظل واجهتك صادقة لأنها تشرح قاعدة حقيقية.
قيود check للقواعد التي يجب أن تكون صحيحة دائمًا
قيد check هو قاعدة تفرضها القاعدة على كل صف، في كل مرة. إذا أُدخلت قيمة تكسر القاعدة، يفشل الحفظ. هذا بالضبط ما تريده للقواعد التي لا يجب انتهاكها، حتى لو أُنشأت البيانات من شاشات مختلفة، استيراد، أو عمليات آلية.
أفضل القيود بسيطة ومتوقعة. إن لم يستطع المستخدم تخمين القاعدة، سيظل يواجه الأخطاء مرارًا. اجعل التحققات مركزة على الحقائق، لا على السياسات المعقدة.
أمثلة شائعة للقيود التي تعود بالنفع بسرعة:
- نطاقات: الكمية بين 1 و1000، العمر بين 13 و120
- حالات مسموح بها: الحالة يجب أن تكون Draft أو Submitted أو Approved أو Rejected
- أعداد موجبة: المبلغ
> 0، الخصم بين 0 و100 - ترتيب التواريخ:
end_date >= start_date - منطق بسيط: إذا كانت الحالة = Approved حينها
approved_atليست null
الخدعة التي تجعل التحققات ودودة هي كيفية صياغة رسالة الواجهة. لا تردّد اسم القيد. أخبر المستخدم ماذا يغيّر.
أنماط جيدة:
- "الكمية يجب أن تكون بين 1 و1000."
- "اختر حالة: Draft, Submitted, Approved, أو Rejected."
- "يجب أن يكون تاريخ الانتهاء مساوٍ أو لاحقًا لتاريخ البدء."
- "يجب أن يكون المبلغ أكبر من 0."
في باني بلا-كود مثل AppMaster، لا بأس بمراعاة نفس التحققات في الواجهة لإعطاء تغذية فورية، لكن احتفظ بقيد check في القاعدة كحاجز أخير. هكذا، إذا أضيفت شاشة جديدة لاحقًا، تظل القاعدة سارية.
المفاتيح الخارجية التي تحافظ على صحة العلاقات
المفتاح الخارجي (FK) يفرض وعدًا بسيطًا: إن قال حقل أنه يشير إلى سجل آخر، يجب أن يكون هذا السجل موجودًا. إذا كان للأمر CustomerId، ترفض القاعدة أي طلب يشير إلى عميل غير موجود في جدول Customers.
هذا مهم لأن حقول العلاقات هي حيث تظهر البيانات "قريبة من الصحيحة". شخص يكتب اسم عميل بشكل خاطئ قليلاً، يلصق معرف قديم، أو يختار سجلًا حُذف بالأمس. بدون FK، تبدو تلك الأخطاء سليمة حتى تنهار التقارير أو الفواتير أو دعم العملاء.
نمط الواجهة واضح: استبدل النص الحر بخيارات آمنة. بدلًا من حقل نصي لـ"العميل"، استخدم اختيارًا أو بحثًا أو إكمالًا تلقائيًا يحفظ ID العميل خلف الكواليس. في باني بدون-كود (على سبيل المثال، مكونات واجهة AppMaster المربوطة بالنماذج)، يعني ذلك عادةً ربط قائمة منسدلة أو قائمة بحث بجدول Customers وحفظ المرجع المختار، ليس التسمية.
عندما يكون السجل المرجعي مفقودًا أو محذوفًا، قرّر السلوك مقدمًا. تختار معظم الفرق أحد هذه الأساليب:
- منع الحذف ما دام سجلات مرتبطة موجودة (شائع للعملاء، المنتجات، الأقسام)
- الأرشفة بدل الحذف (حفظ التاريخ دون كسر العلاقات)
- الحذف التتابعي فقط عندما يكون آمنًا حقًا (نادر للبيانات التجارية)
- تعيين المرجع إلى فارغ فقط عندما تكون العلاقة اختيارية
وخَطط أيضًا لتدفق "إنشاء سجل مرتبط جديد". لا ينبغي للنموذج أن يجبر المستخدم على المغادرة، إنشاء العميل في مكان آخر، ثم العودة وإعادة كتابة كل شيء. نهج عملي هو إجراء "عميل جديد" ينشئ العميل أولًا، ثم يعيد الـID الجديد ويختاره تلقائيًا.
إذا فشل FK، لا تعرض رسالة قاعدة بيانات خام. اشرح ما حدث بلغة بسيطة: "اختر عميلًا موجودًا (العميل الذي اخترته لم يعد متاحًا)." جملة واحدة تمنع انتشار علاقة مكسورة.
التعامل مع فشل القيود في سير الواجهة
النماذج الجيدة تلتقط الأخطاء مبكرًا، لكنها لا تتظاهر بأنها الحكم النهائي. الواجهة تساعد المستخدم على العمل أسرع؛ قاعدة البيانات تضمن ألا يُحفَظ ما قد يسبب مشاكل.
التحققات على جهة العميل مخصصة للأمور الواضحة: حقل مطلوب فارغ، بريد إلكتروني يفتقد @، أو رقم خارج نطاق معقول. عرض هذه فورًا يجعل النموذج يبدو تفاعليًا ويقلل من محاولات الحفظ الفاشلة.
التحققات على الخادم هي حيث تقوم القيود بعملها الحقيقي. حتى إن فاتت الواجهة شيئًا (أو قدّم شخصان نفس القيمة في نفس الوقت)، تمنع قاعدة البيانات التكرارات والقيم غير الصالحة والعلاقات المكسورة.
عندما يعود خطأ قيد من الخادم، اجعل الاستجابة متوقعة:
- احتفظ بكل مدخلات المستخدم في النموذج. لا تعيد ضبط الصفحة.
- ظلل الحقل الذي سبب المشكلة وأضف رسالة قصيرة بجانبه.
- إن كانت المشكلة تشمل عدة حقول، أظهر رسالة علوية وما زلْ ظلّل أفضل حقل مطابق.
- اقترح إجراء آمنًا: تعديل القيمة، أو فتح السجل الموجود إن كان ذلك مناسبًا.
وأخيرًا، سجّل ما حدث حتى تحسّن النموذج. سجّل اسم القيد، الجدول/الحقل، وإجراء المستخدم الذي أطلقه. إن فشل قيد واحد كثيرًا، أضف تلميحًا صغيرًا في الواجهة أو تحققًا إضافيًا على جهة العميل. ارتفاع مفاجئ قد يعني شاشة مربكة أو تكامل معطل.
مثال: نموذج طلب داخلي يبقى نظيفًا مع مرور الوقت
تخيّل أداة داخلية بسيطة يستخدمها المبيعات والدعم: نموذج "إنشاء طلب". يبدو بلا أذى، لكنه يتعامل مع أهم الجداول في قاعدة بياناتك. إن قبل النموذج مدخلات خاطئة مرة واحدة، تنتشر الأخطاء إلى الفواتير، الشحن، الاستردادات، والتقارير.
الطريقة النظيفة لبنائه هي ترك قواعد قاعدة البيانات تقود الواجهة. يصبح النموذج واجهة ودودة لقواعد تظل صامدة، حتى عندما يستورد شخص ما بيانات أو يحرّر سجلات في مكان آخر.
مثال على ما يفرضه جدول Order:
- رقم طلب فريد: كل
order_numberيجب أن يكون مختلفًا. - تحققات لقاعدة قواعد دائمًا صحيحة:
quantity > 0،unit_price >= 0، وربماunit_price <= 100000. - مفتاح خارجي إلى Customer: كل طلب يجب أن يشير إلى سجل عميل حقيقي.
انظر ماذا يحدث في الاستخدام الحقيقي.
ممثل يدخل رقم طلب من الذاكرة ويعيد استخدام رقم بالخطأ. يفشل الحفظ على قيد الفريدة. بدلًا من رسالة "فشل الحفظ" الغامضة، يمكن للواجهة أن تقول: "رقم الطلب موجود بالفعل. استخدم الرقم التالي المتاح أو ابحث عن الطلب الموجود."
لاحقًا، دمُج أو حُذف سجل عميل بينما لا يزال شخص ما لديه النموذج مفتوحًا. يضغط حفظ مع العميل القديم المحدد. يمنع المفتاح الخارجي الحفظ. استجابة واجهة جيدة هي: "ذلك العميل لم يعد متاحًا. حدّث قائمة العملاء واختر عميلًا آخر." ثم تعيد تحميل قائمة العملاء وتحفظ بقية النموذج سليمة حتى لا يفقد المستخدم عمله.
مع مرور الوقت، يحافظ هذا النمط على اتساق الطلبات دون الاعتماد على حذر الجميع كل يوم.
أخطاء شائعة تسبب رسائل مربكة وبيانات غير نظيفة
أسرع طريق إلى بيانات فوضوية هو الاعتماد على قواعد الواجهة فقط. حقل مطلوب في نموذج يساعد، لكنه لا يحمي الاستيرادات، التكاملات، تعديلات المسؤولين، أو شاشة ثانية تكتب إلى نفس الجدول. إن قبلت قاعدة البيانات القيم الخاطئة، ستظهر في كل مكان لاحقًا.
خطأ شائع آخر هو كتابة قيود صارمة جدًا للحياة الواقعية. تحقق يبدو صحيحًا في اليوم الأول قد يحجب حالات استخدام طبيعية بعد أسبوع، مثل المردودات، الشحن الجزئي، أو أرقام هواتف من دول أخرى. قاعدة جيدة: قيد ما يجب أن يكون صحيحًا دائمًا، لا ما هو صحيح عادةً.
التحديثات كثيرًا ما تُهمل. اصطدامات الفريدة على التعديل كلاسيكية: يفتح المستخدم سجلًا، يغيّر حقلًا غير ذي صلة، ويفشل الحفظ لأن قيمة "الفريدة" تغيرت في مكان آخر. انتقالات الحالة فخ آخر. إن كان السجل يمكن أن ينتقل من Draft إلى Approved إلى Cancelled، تأكد أن التحققات تسمح بالمسار الكامل، لا الحالة النهائية فقط.
المفاتيح الخارجية تفشل بأكثر الطرق الممكن تجنُّبها: السماح للمستخدمين بكتابة معرفات. إن سمحت الواجهة بنص حر للعلاقات، ستحصل على علاقات مكسورة. فضّل محدّدات مرتبطة بالسجلات القائمة، واحتفظ بالمفتاح الخارجي كحاجز أخير في القاعدة.
أخيرًا، أخطاء قاعدة البيانات الخام تثير الذعر وتزيد تذاكر الدعم. يمكنك الحفاظ على قيود صارمة وإظهار رسائل بشرية في نفس الوقت.
قائمة إصلاح قصيرة:
- اجعل القيود مصدر الحقيقة، لا قواعد الواجهة فقط
- صمّم التحققات حول سياقات العمل الحقيقية، بما في ذلك الاستثناءات
- تعامل مع التعديلات والانتقالات، لا فقط عملية "الإنشاء"
- استخدم محددات للعلاقات، لا معرفات مكتوبة
- خرّج فشل القيود إلى رسائل ودية على مستوى الحقول
قائمة فحص سريعة وخطوات لاحقة لفرق بدون-كود
قبل الإطلاق، افترض أن النموذج سيُستخدم على عجل، في يوم سيئ، وببيانات منسوخة. النهج الأكثر أمانًا هو قيود قاعدة البيانات للتحقق من النماذج، بحيث تفرض القاعدة الحقيقة حتى لو فاتت الواجهة شيئًا.
فحوصات سريعة قبل الإطلاق
نفّذ هذه الفحوص على كل نموذج يكتب إلى قاعدة بياناتك:
- التكرارات: حدّد ما يجب أن يكون فريدًا (بريد إلكتروني، رقم طلب، معرف خارجي) وتأكد من وجود القاعدة الفريدة
- العلاقات المفقودة: تأكد أن كل علاقة مطلوبة مفروضة (مثلًا، الطلب يجب أن يملك Customer)
- النطاقات غير الصالحة: أضف تقييدات للقيم التي يجب أن تبقى ضمن حدود (الكمية
> 0، الخصم بين 0 و100) - الحقول المطلوبة: تأكد أن "اللازم وجوده" مُطبق على مستوى قاعدة البيانات وليس بأعلام الواجهة فقط
- القيم الافتراضية الآمنة: قرّر ما الذي يجب ملؤه تلقائيًا (مثل
status = "Draft") حتى لا يخمن الناس
ثم اختبر كالمستخدم، لا كالباني: نفّذ إرسالًا نظيفًا كاملًا، ثم حاول كسره بتكرارات، علاقات مفقودة، أرقام خارج النطاق، حقول مطلوبة فارغة، ومدخلات من نوع خاطئ.
خطوات لاحقة في AppMaster
إذا كنت تبني على AppMaster (appmaster.io)، نمذج القواعد أولًا في Data Designer (unique, check, وforeign keys)، ثم ابنِ النموذج في مُنشئ الويب أو الجوال وربط منطق الحفظ في Business Process Editor. عندما يفشل قيد، التقط الخطأ وخرّجه إلى إجراء واضح واحد: ماذا تغيّر وأين.
وحافظ على نصوص الأخطاء متناسقة وهادئة. تجنب إلقاء اللوم. فضّل "استخدم بريدًا فريدًا" على "البريد غير صالح". إن أمكن، اعرض القيمة المتصادمة أو النطاق المطلوب حتى يكون الحل واضحًا.
اختر نموذجًا حقيقيًا واحدًا (مثل "إنشاء عميل" أو "طلب جديد"), ابنه كاملًا من البداية للنهاية، ثم تحقّق منه ببيانات فوضوية من عمل الفريق اليومي.
الأسئلة الشائعة
ابدأ بقيود قاعدة البيانات لأنها تحمي كل مسار كتابة: نماذج الويب، شاشات الجوال، الاستيراد، ومكالمات API. لا يزال التحقق في الواجهة مفيدًا لإعطاء تغذية راجعة أسرع، لكن قاعدة البيانات يجب أن تكون البوابة النهائية حتى لا تتسلل القيم السيئة عبر شاشة أو عملية آلية مختلفة.
ركز على الأساسيات التي توقف معظم الأضرار الحقيقية للبيانات: unique لمنع التكرارات، check للقواعد التي يجب أن تكون صحيحة دائمًا، وforeign keys للعلاقات الحقيقية. أضِف فقط القواعد التي أنت واثق أنها لا يجب أن تُنتهَك حتى أثناء الاستيراد أو الحالات الاستثنائية.
استخدم قيد الفريدة عندما يجب أن يعرّف القيمة سجلًا واحدًا ضمن النطاق المختار، مثل البريد الإلكتروني أو رقم الفاتورة أو رقم الموظف. قرّر النطاق أولًا (عالمي مقابل داخل شركة/موقع) حتى لا تمنع تكرارات صحيحة حسب سياق العمل.
اجعل قيود الــcheck بسيطة ومتوقعة، مثل النطاقات، الأعداد الموجبة، أو ترتيب التواريخ. إذا لم يستطع المستخدم تخمين القاعدة من تسمية الحقل، فسيكرر الأخطاء. صِف التوجيه في الواجهة بوضوح وتجنّب التحققات التي تشفر سياسات معقّدة.
قيد المفتاح الخارجي يمنع المراجع "القريبة من الصحيحة"، مثل أمر يشير إلى عميل لم يعد موجودًا. في الواجهة، تجنّب حقل نصي حر لعلاقة؛ استخدم مُحدِّدًا أو بحثًا يحفظ ID السجل المرتبط بدلًا من التسمية فقط.
عامل كل قيد كـ"عقد خطأ": ترجم الفشل التقني إلى جملة تشرح ما حدث وماذا يجب فعله بعد ذلك. على سبيل المثال، استبدل رسالة فشل الفريدة التقنية بـ: “هذا البريد الإلكتروني مستخدم بالفعل. استخدم بريدًا مختلفًا أو سجّل الدخول.”
اعرض أخطاء الحقول المفردة مباشرة بجانب الحقل واحتفظ بمدخلات المستخدم حتى يتمكن من التصحيح بسرعة. للقواعد التي تتعلق بعدة حقول (مثل تواريخ البداية والنهاية)، استخدم رسالة قصيرة على مستوى النموذج ومع ذلك ظلل المجال الأنسب حتى يكون الإصلاح واضحًا.
التحققات في الواجهة يجب أن تلتقط المشكلات الواضحة مبكرًا (حقول مطلوبة فارغة، تنسيق أساسي خاطئ) لتقليل محاولات الحفظ الفاشلة. قاعدة البيانات لا تزال بحاجة للقيود للتعامل مع ظروف السباق ومسارات الكتابة البديلة، مثل تقديم مستخدمين اثنين نفس رقم الفاتورة في الوقت نفسه.
لا تعتمد على قواعد الواجهة فقط، ولا تجعل القيود أشد من الواقع العملي، ولا تنسَ عمليات التحديث وانتقالات الحالة. تجنّب أيضًا السماح للمستخدمين بكتابة معرفات للعلاقات؛ استخدم محددات واجعل قاعدة البيانات كخط دفاع أخير. وأخيرًا، ترجم أخطاء قاعدة البيانات إلى رسائل بشرية لتقليل الذعر وتذاكر الدعم.
نموذج عملي: صمّم البيانات والقيود أولًا في Data Designer، بعد ذلك ابنِ النموذج واربط فشل القيود برسائل ودية في سير واجهة المستخدم. في AppMaster عادةً تعرّف قواعد unique/check/FK في النموذج، توصل الحفظ في Business Process Editor، وتبقي نصوص الأخطاء متناسقة عبر الويب والجوال. ابدأ بنموذج واحد ذي تأثير كبير، ثم جرّبه ببيانات فوضوية من عمل الفريق.


