إزاي تدير حذف البيانات في قواعد البيانات (Database)؟ الفرق بين الحذف النهائي والمؤقت
أكيد مريت بالموقف ده قبل كده: العميل بيكلمك في التليفون "يا هندسة، أنا مسحت بيانات مهمة جداً بالخطأ، هل فيه أي طريقة نرجعها؟". هنا بتبدأ "الدراما" والبحث في الـ Backups، وفي الآخر ممكن نلاقي إننا مش قادرين نسترجع حاجة. طيب ليه بنحط نفسنا في الموقف ده؟ النهاردة هنتكلم عن الفرق بين الحذف النهائي (Hard Deletes) والحذف المؤقت (Soft Deletes) وإزاي تنفذهم في Laravel زي المحترفين.
Table of contents [Show]
يعني إيه Hard Delete؟
الحذف النهائي أو Hard Delete هو العملية التقليدية اللي بنعمل فيها DELETE FROM table WHERE id = 1. بمجرد ما الكود ده يتنفذ، الداتا بتتمسح من الـ Database للأبد ومفيش طريق رجعة. طبعاً ده بيوفر مساحة تخزين، لكنه خطر جداً في التطبيقات اللي فيها بيانات حساسة زي الفواتير أو حسابات المستخدمين.
إيه هو الـ Soft Delete وليه بنستخدمه؟
الـ Soft Delete هو استراتيجية بتخلينا نمسح البيانات "ظاهرياً" بس. بدل ما نشيل الصف من الجدول، بنضيف عمود جديد اسمه deleted_at. لما المستخدم يدوس مسح، الـ Framework بيحط تاريخ ووقت اللحظة دي في العمود ده، وبكده الـ Query العادي مش هيشوف البيانات دي، لكنها لسه موجودة في الـ Database ونقدر نرجعها في أي وقت بضغطة زرار.
تنفيذ الـ Soft Deletes في لارافيل (Laravel)
لارافيل بيسهل علينا الموضوع ده جداً. عشان تفعل الخاصية دي في أي Model، اتبع الخطوات دي:
1. إضافة عمود التوقيت للجدول:
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
});
2. تجهيز الـ Model:
كل اللي عليك تعمله إنك تستخدم Trait اسمها SoftDeletes جوه الموديل بتاعك:
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
كده أي عملية حذف $user->delete() هتعمل تحديث لعمود deleted_at بدل الحذف، وأي User::all() هتجيب البيانات اللي مش ممسوحة بس. ولو حبيت تجيب الكل بما فيهم الممسوحين، بتستخدم User::withTrashed()->get().
متى تختار الـ Hard Delete؟
مش دايماً الـ Soft Delete هو الحل المثالي. في حالات معينة لازم تستخدم Hard Delete، زي:
- بيانات مؤقتة زي الـ Logs أو الـ Cache اللي حجمها بيكبر بسرعة وبيملى الـ Disk Space.
- بيانات مش مهمة ومش محتاجين نرجعها لأي سبب قانوني أو إداري.
- جداول الـ Pivot في العلاقات المعقدة عشان ما تسببش تعارض في الـ Unique Constraints.
نصيحة من أخ لمبرمج محترف
نصيحتي ليك يا بطل، ما تبالغش في استخدام الـ Soft Deletes. كتر البيانات الممسوحة "ظاهرياً" بتقلل أداء الـ Database مع الوقت (بسبب الـ Index size). دايماً فكر في استراتيجية للـ Archiving، يعني مثلاً انقل البيانات الممسوحة من فترة طويلة لجدول تاني (Archive Table) أو امسحها نهائياً بعد مرور 30 يوم. التوازن هو سر الشطارة في الـ Software Architecture.