နားလည်ထားရမယ့် အချက်
Application validation တစ်ခုတည်းကိုယုံလို့မရပါဘူး—script၊ admin tool သို့ service တခြားတစ်ခုက database ကိုရေးနိုင်ပါတယ်။ Constraint က entry point အားလုံးအတွက် နောက်ဆုံးစည်းမျဉ်းဖြစ်ပါတယ်။ Foreign key က parent/child relationship ကိုကာကွယ်ပြီး `ON DELETE` action ကို domain meaning အလိုက်တိတိကျကျရွေးရပါတယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Tutorial တစ်ခုတွင် lesson အများကြီးရှိနိုင်အောင် `app.lessons` ကိုဖန်တီးမယ်။ Tutorial တစ်ခုဖျက်လျှင် lesson များပါဖျက်လိုသော ownership relationship ဖြစ်လို့ `ON DELETE CASCADE` သုံးပြီး tutorial တစ်ခုအတွင်း lesson number မထပ်အောင် composite unique constraint ထည့်မယ်။
အတူတူ စမ်းရေးကြည့်မယ်
CREATE TABLE app.lessons (
lesson_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
tutorial_id bigint NOT NULL
REFERENCES app.tutorials(tutorial_id) ON DELETE CASCADE,
lesson_number integer NOT NULL CHECK (lesson_number > 0),
title text NOT NULL CHECK (length(trim(title)) >= 3),
duration_minutes integer NOT NULL CHECK (duration_minutes BETWEEN 1 AND 600),
UNIQUE (tutorial_id, lesson_number),
UNIQUE (tutorial_id, lesson_id)
);
CREATE TABLE app.enrollments (
enrollment_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id bigint NOT NULL REFERENCES app.users(user_id) ON DELETE CASCADE,
tutorial_id bigint NOT NULL REFERENCES app.tutorials(tutorial_id) ON DELETE CASCADE,
enrolled_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (user_id, tutorial_id)
);Orphan lesson နှင့် duplicate lesson number မဝင်နိုင်သော table ရမည်။၅ မိနစ် စမ်းကြည့်
Enrollment table အတွက် user/tutorial foreign keys နှင့် duplicate enrollment မဖြစ်စေသော unique constraint ရေးပါ။
သတိလေးတစ်ချက်
`ON DELETE CASCADE` ကိုအလွယ်တကူမသုံးပါနှင့်။ Ownership relationship မဟုတ်လျှင် မတော်တဆ data အများအပြားဖျက်နိုင်ပါတယ်။
PostgreSQL — Constraints — PostgreSQL Global Development Group