Sebagai seorang siswa CS, saya telah belajar banyak bahasa pemrograman selama bertahun-tahun, yang sebagian besar memiliki konsep "nullable" atau "opsional". Perhatikan bahwa saya tidak berbicara tentang pointer atau referensi nol, atau bahasa yang diketik dengan lemah seperti JavaScript di mana pun bisa null
. Contoh dari apa yang saya bicarakan meliputi boost::optional
(C ++), java.util.Optional
(Java 8.0), prelude.Maybe
(Haskell), dan semua '?' jenis (mis int?
. float?
, C # dan Kotlin). Ini adalah konstruksi yang menambahkan nullability ke tipe yang sebelumnya tidak dapat nullable dalam sistem tipe statis yang ketat.
SQL memiliki konsep yang sama: tipe seperti INTEGER
dapat dibuat nullable atau non-nullable - tetapi ada twist. Dalam SQL, INTEGER
nullable secara default, dan harus ditulis secara eksplisit INTEGER NOT NULL
agar tidak dapat nullable.
Ini menurut saya sangat kontra-intuitif dan berpotensi berbahaya karena memungkinkan NULL menjadi perilaku default. Jelas SQL sudah ada begitu lama pada saat ini sehingga (kebanyakan) pengembang SQL telah mengembangkan kesadaran yang sehat akan perangkap NULL. Tetapi saya tidak dapat membayangkan bahwa pada masa-masa awal NULL sering merayap di tempat-tempat yang tak terduga dan bermasalah.
SQL memang mendahului semua contoh yang saya berikan, jadi mungkin ini hanyalah masalah bagi evolusi sejarah. Namun, saya harus bertanya, apakah ada alasan bagus untuk bahasa dirancang seperti ini, dengan jenis yang dapat dibatalkan secara default?
Jika demikian, apakah itu hanya alasan historis, atau apakah logika mendukung desain database saat ini?
Sunting: Saya tidak bertanya mengapa NULL adalah bagian dari SQL atau mengapa kolom nullable berguna. Saya hanya bertanya mengapa kolom dapat dibatalkan secara default . Sebagai contoh, mengapa kita menulis:
column1 FLOAT,
column2 FLOAT NOT NULL
Daripada:
column1 FLOAT NULLABLE,
column2 FLOAT