کلید اصلی و کلید خارجی: چسبِ بین جدولها
این نسخهی پیشنمایش عمومیه. برای نمره گرفتن، ذخیرهی پیشرفت و باز کردن درسهای بعدی ثبتنام کن.
ثبتنام رایگانورودمسئله: یک ردیف را چطور یکتا بشناسیم؟
فرض کن دو مشتری هر دو اسمشان «رضا» باشد و هر دو از تهران. اگر بخواهی به یکی از آنها یک سفارش وصل کنی، از کجا بفهمی کدام رضا؟ اسم و شهر برای تشخیصِ یکتا کافی نیستند. به چیزی نیاز داریم که تضمینشده برای هر ردیف یکتاست.
کلید اصلی (Primary Key)
به همین خاطر تقریباً هر جدولْ یک ستونِ id دارد:
id │ name │ city
────┼───────┼───────
1 │ علی │ تهران
2 │ سارا │ شیراز
3 │ رضا │ تهران
این id کلید اصلی (primary key) جدول است. دو قانونِ آهنین دارد:
- یکتاست — هیچ دو ردیفی نمیتوانند
idیکسان داشته باشند. - هیچوقت خالی نیست — هر ردیف حتماً یک کلید اصلی دارد.
پس وقتی بگویی «مشتریِ شماره ۳»، دقیقاً یک نفر منظور است — بیابهام. کلید اصلی، شناسنامهی ردیف است.
کلید خارجی (Foreign Key): وصل کردنِ جدولها
حالا سفارشها. یک سفارش به یک مشتری تعلق دارد. آیا باید اسم و شهر و تاریخِ عضویتِ مشتری را دوباره داخلِ جدولِ سفارش کپی کنیم؟ نه — این یعنی تکرارِ داده و دردسرِ بیپایان (اگر مشتری شهرش را عوض کند، باید همهی سفارشهایش را هم دستی عوض کنی).
راهِ درست: سفارش فقط شناسهی مشتری را نگه میدارد:
orders
id │ customer_id │ ordered_at │ status
────┼─────────────┼─────────────┼─────────
1 │ 1 │ 2024-01-20 │ paid
3 │ 1 │ 2024-02-18 │ paid
4 │ 3 │ 2024-03-10 │ pending
ستونِ customer_id یک کلید خارجی (foreign key) است: اشاره میکند به id در جدولِ customers. سفارشِ شماره ۱ و ۳ هر دو customer_id = 1 دارند، یعنی هر دو برای «علی» (مشتریِ شماره ۱) هستند. این ارجاع، چسبی است که جدولها را به هم وصل میکند — بدون تکرارِ داده.
نکتهی ظریف: کلید خارجی میتواند خالی باشد
برخلافِ کلید اصلی، یک کلید خارجی گاهی میتواند خالی (NULL) باشد. در فروشگاهِ ما سفارشِ شماره ۱۲ یک خریدِ مهمان است: customer_id آن NULL است، چون به هیچ مشتریِ ثبتشدهای وصل نیست. این NULLها بعداً در درسهای پیوند (JOIN) و شرطها نقشِ مهمی بازی میکنند، پس همین حالا بدان که وجود دارند.
نقشهی ارجاعها در فروشگاه
products.category_id→categories.id(هر محصول در یک دسته)orders.customer_id→customers.id(هر سفارش برای یک مشتری، یا مهمان)order_items.order_id→orders.idوorder_items.product_id→products.idemployees.manager_id→employees.id— جالب است: یک جدول به خودش ارجاع میدهد! این چارتِ سازمانیِ کارمندان را میسازد (هر کارمند یک مدیر دارد که خودش یک کارمند است).
همین چند ارجاعِ ساده کافی است تا بتوانی بپرسی «هر محصول در کدام دسته است؟» یا «هر سفارش برای کدام مشتری است؟» — کاری که از درسهای پیوند شروع میکنیم.