Kolom (atau kolom) dari kunci utama harus NOT NULL. Catatan tidak dapat diidentifikasi secara unik oleh NULL. Jadi kolom ID di ujung referensi kunci asing harus didefinisikan sebagai NOT NULL.
Namun, itu adalah keputusan desain yang sah untuk hubungan kunci asing menjadi opsional, dan cara untuk mewakilinya adalah dengan membuat akhir referensi dari kunci opsional, yaitu mengizinkan NULL.
Dalam istilah pemodelan data, apa yang telah Anda gambarkan adalah busur (eksklusif):"tabel ... dengan dua atau lebih kunci asing di mana satu dan hanya satu dari mereka dapat menjadi non-null." Dalam pemodelan logis, busur sangat dapat diterima, tetapi ada pendapat kuat yang mendukung penerapannya sebagai tabel terpisah. Dalam skenario Anda, itu akan menjadi Sale
generik tabel ditambah dua sub-jenis tabel, VehicleSale
dan PieceSale
.
Keuntungan dari implementasi tabel terpisah adalah:
- lebih mudah untuk menerapkan batasan kunci asing;
- lebih mudah untuk menambahkan kolom tambahan yang berkaitan dengan (misalnya) penjualan kendaraan yang tidak berlaku untuk penjualan satuan;
- lebih mudah untuk memperluas model dengan sub-jenis tambahan;
- model data yang lebih jelas, yang dapat menyederhanakan pengembangan aplikasi.
Namun, keuntungannya tidak semuanya satu arah. Meskipun cukup mudah untuk memastikan bahwa Sale
berlaku untuk VehicleSale
atau PieceSale
tetapi tidak keduanya, menerapkan aturan bahwa Sale
harus memiliki catatan anak benar-benar menjadi sangat buruk.
Jadi, saran yang berlaku adalah bahwa busur eksklusif salah, dan umumnya saran yang baik. Tapi itu tidak sejelas yang terlihat beberapa orang.