Katakanlah Anda memiliki tabel Pesanan dengan kunci asing ke Id Pelanggan. Sekarang, misalkan Anda ingin menambahkan Pesanan tanpa Id Pelanggan, (apakah itu mungkin adalah pertanyaan lain) Anda harus membuat kunci asing NULL ... Apakah itu praktik yang buruk atau Anda lebih suka bekerja dengan tabel tautan antara Pesanan dan Pelanggan? Meskipun hubungannya adalah 1 ke n, tabel tautan akan membuatnya menjadi n ke n. Di sisi lain, dengan tabel tautan, saya tidak memiliki NULLS itu lagi ...
Sebenarnya tidak akan ada banyak NULL dalam database, karena record dengan foreign key ke NULL hanya sementara sampai pelanggan untuk pesanan ditambahkan.
(Dalam kasus saya, ini bukan Pesanan dan Pelanggan).
EDIT: Bagaimana dengan Pelanggan yang belum ditetapkan untuk ditautkan?
sumber
Jawaban:
Memiliki tabel tautan mungkin merupakan pilihan yang lebih baik. Setidaknya itu tidak melanggar normalisasi BCNF (bentuk normal Boyce-Codd). namun saya lebih suka bersikap pragmatis. Jika Anda memiliki sangat sedikit dari nilai nol ini dan hanya sementara, saya pikir Anda harus melewati tabel tautan karena hanya menambah kompleksitas pada skema.
Di samping catatan; menggunakan tabel tautan tidak selalu membuatnya menjadi n menjadi n, jika Anda dalam tabel tautan menggunakan kunci asing yang menunjuk ke tabel pesanan Anda sebagai kunci utama dalam tabel tautan itu hubungannya masih 1..n. Hanya boleh ada satu entri di tabel tautan itu per pesanan.
sumber
Tidak Tidak ada yang salah dengan Nullable FKs. Hal ini umum terjadi ketika entitas yang ditunjuk FK berada dalam hubungan (nol atau satu) hingga (1 atau banyak) dengan tabel referensi Kunci utama.
Contohnya mungkin jika Anda memiliki alamat fisik dan atribut alamat surat (kolom) dalam tabel, dengan FK ke tabel alamat. Anda dapat membuat alamat fisik nullable untuk ditangani saat entitas hanya memiliki kotak pos (alamat surat), dan alamat surat yang tidak dapat ditangani jika alamat surat sama dengan alamat fisik (atau tidak).
sumber
Hanya jika Anda tahu lebih baik daripada Chris Date "apa arti sebenarnya dari bentuk normal pertama". Jika x dan y keduanya nihil, dan memang di beberapa baris x dan y keduanya
null
, makaWHERE x=y
tidak menghasilkantrue
. Ini membuktikan tanpa keraguan bahwa nol bukanlah nilai (karena nilai riil selalu sama dengan dirinya sendiri). Dan karena RM menetapkan bahwa "harus ada nilai di setiap sel tabel", apa pun yang mungkin berisi null, bukanlah hal yang berhubungan, dan dengan demikian pertanyaan tentang 1NF bahkan tidak muncul.Lihat di atas untuk alasan kuat yang mendasari argumen itu.
Hanya jika Anda kebal terhadap sakit kepala yang biasanya terjadi di seluruh dunia. Salah satu sakit kepala seperti itu (dan ini hanya masalah kecil, dibandingkan dengan
null
fenomena lain ) adalah kenyataan bahwaWHERE x=y
dalam SQL sebenarnya berartiWHERE x is not null and y is not null and x=y
, tetapi sebagian besar programmer tidak menyadari fakta itu dan hanya membacanya. Kadang-kadang tanpa bahaya, di lain waktu tidak.Faktanya, kolom nullable melanggar salah satu aturan desain database paling mendasar: jangan gabungkan elemen informasi yang berbeda dalam satu kolom. Null melakukan hal itu karena menggabungkan nilai boolean "kolom ini adalah / tidak benar-benar ada" dengan nilai sebenarnya.
sumber
Saya tidak bisa melihat ada yang salah dengan itu hanya hubungan n-1 opsional yang akan diwakili dengan null di foreign-key. Jika tidak, jika Anda meletakkan tabel tautan Anda, maka Anda harus mengatur bahwa itu tidak menjadi hubungan nn, sehingga menyebabkan lebih banyak masalah.
sumber
Hubungan opsional pasti dimungkinkan dalam model relasional.
Anda dapat menggunakan null untuk menyatakan tidak adanya hubungan. Mereka nyaman, tetapi mereka akan menyebabkan Anda sakit kepala yang sama dengan nulls menyebabkan Anda di tempat lain. Satu tempat di mana mereka tidak menimbulkan masalah adalah bergabung. Baris yang memiliki null dalam kunci asing tidak cocok dengan baris mana pun dalam tabel yang direferensikan. Jadi mereka keluar dari gabungan dalam. Jika Anda melakukan gabungan luar, Anda akan berurusan dengan nol.
Jika Anda benar-benar ingin menghindari null (bentuk normal ke-6), Anda dapat mendekomposisi tabel. Salah satu dari dua tabel yang diuraikan memiliki dua kolom kunci asing. Salah satunya adalah kunci asing opsional yang Anda miliki, dan yang lainnya adalah kunci asing yang mereferensikan kunci utama dari tabel asli. Sekarang Anda harus menggunakan batasan untuk mencegah hubungan menjadi banyak-ke-banyak, jika Anda ingin mencegahnya.
sumber
Menggunakan NULL akan menjadi cara yang baik untuk membersihkan pesanan yang tidak lengkap:
Di atas akan menunjukkan pesanan yang lebih lama dari 15 menit tanpa ID pelanggan terkait.
sumber
Jika Anda hanya menambahkan pesanan sementara tanpa id pelanggan sampai pelanggan ditentukan, bukankah lebih mudah untuk menambahkan pelanggan dan memesan dalam satu transaksi, sehingga menghilangkan kebutuhan untuk entri kunci asing NULL dan menghindari kendala atau pemicu Anda telah mengatur untuk dilanggar?
Biasanya situasi ini muncul di aplikasi web di mana pesanan dirinci sebelum pelanggan menentukan siapa dia. Dan dalam situasi tersebut, pesanan disimpan dalam status server atau dalam cookie hingga semua status yang diperlukan untuk pesanan lengkap diberikan, dan saat itu pesanan tersebut disimpan ke database.
Kunci asing NULL baik-baik saja untuk hal-hal seperti alamat, seperti yang disebutkan di atas. Tetapi bidang pelanggan NULL tidak masuk akal untuk suatu pesanan dan harus dibatasi.
sumber
Anda selalu dapat menambahkan baris buatan ke tabel Pelanggan Anda, seperti Id = -1 dan CustomerName = 'Unknown' dan kemudian jika Anda biasanya menetapkan CustomerId Anda di Order NULL atur ke -1.
Hal ini memungkinkan Anda untuk tidak memiliki FK yang dapat dinihilkan tetapi masih mewakili kekurangan data dengan tepat (dan akan menyelamatkan Anda dari pengguna hilir yang tidak mengetahui cara menangani NULL).
sumber
FK yang tidak dapat dibatalkan untuk relasi banyak-ke-satu opsional benar-benar baik-baik saja.
sumber
Saya pernah mendengarnya berpendapat bahwa kolom Nullable secara umum melanggar tingkat normalisasi pertama. Tapi dalam prakteknya sangat praktis.
sumber
Ya, ada yang salah. Ini bukan kunci asing jika nullable. Desain database-nya berdasarkan kode. Mungkin Anda membuat tautan nol untuk tidak ditetapkan. atau "Unassigned" jika Anda menggunakan karakter col. Jaga integritas data Anda 100%.
sumber