SQL: string kosong vs nilai NULL

72

Saya tahu subjek ini sedikit kontroversial dan ada banyak berbagai artikel / opini beredar di internet. Sayangnya, sebagian besar dari mereka menganggap orang itu tidak tahu apa perbedaan antara NULL dan string kosong. Jadi mereka bercerita tentang hasil yang mengejutkan dengan bergabung / agregat dan umumnya melakukan pelajaran SQL sedikit lebih maju. Dengan melakukan ini, mereka benar-benar kehilangan inti dan karena itu tidak berguna bagi saya. Jadi semoga pertanyaan ini dan semua jawaban akan sedikit bergerak maju.

Misalkan saya memiliki tabel dengan informasi pribadi (nama, kelahiran, dll) di mana salah satu kolom adalah alamat email dengan tipe varchar. Kami berasumsi bahwa karena alasan tertentu beberapa orang mungkin tidak ingin memberikan alamat email. Saat memasukkan data seperti itu (tanpa email) ke dalam tabel, ada dua pilihan yang tersedia: setel ke NULL atau setel ke string kosong (''). Mari kita asumsikan bahwa saya menyadari semua implikasi teknis dari memilih satu solusi di atas yang lain dan saya dapat membuat query SQL yang benar untuk kedua skenario. Masalahnya adalah bahkan ketika kedua nilai berbeda pada tingkat teknis, mereka sama persis pada tingkat logis. Setelah melihat NULL dan '' Saya sampai pada satu kesimpulan: Saya tidak tahu alamat email orang itu. Juga tidak peduli seberapa keras saya mencoba, Saya tidak dapat mengirim email menggunakan NULL atau string kosong, jadi tampaknya sebagian besar server SMTP di luar sana setuju dengan logika saya. Jadi saya cenderung menggunakan NULL di mana saya tidak tahu nilai dan menganggap string kosong adalah hal yang buruk.

Setelah beberapa diskusi intens dengan rekan-rekan saya datang dengan dua pertanyaan:

  1. apakah saya benar dengan berasumsi bahwa menggunakan string kosong untuk nilai yang tidak diketahui menyebabkan database "berbohong" tentang fakta? Untuk lebih tepatnya: menggunakan ide SQL tentang apa itu nilai dan apa yang tidak, saya mungkin sampai pada kesimpulan: kita memiliki alamat email, hanya dengan mengetahui itu bukan nol. Tetapi kemudian, ketika mencoba mengirim e-mail saya akan sampai pada kesimpulan yang bertentangan: tidak, kami tidak memiliki alamat e-mail, bahwa @! # $ Database pasti berbohong!

  2. Apakah ada skenario logis di mana string kosong '' bisa menjadi pembawa informasi penting yang baik (selain nilai dan tidak ada nilai), yang akan merepotkan / tidak efisien untuk disimpan dengan cara lain (seperti kolom tambahan). Saya telah melihat banyak posting yang mengklaim bahwa kadang-kadang ada baiknya menggunakan string kosong bersama dengan nilai nyata dan NULL, tetapi sejauh ini belum melihat skenario yang logis (dalam hal desain SQL / DB).

PS Beberapa orang akan tergoda untuk menjawab, bahwa itu hanya masalah selera pribadi. Saya tidak setuju. Bagi saya itu adalah keputusan desain dengan konsekuensi penting. Jadi saya ingin melihat jawaban di mana pendapat tentang ini didukung oleh beberapa alasan logis dan / atau teknis.

Jacek Prucia
sumber
11
Apakah Anda sadar bahwa di Oracle, string kosong adalah NULL?
user281377
8
@ammoQ: Perlakuan Oracle terhadap string nol panjang tidak standar. Selain itu, ''bahkan di Oracle, tidak sama dengan NULL. Misalnya, memberikan CHAR(1)kolom nilai yang ''akan dihasilkan ' '(yaitu spasi), bukan NULL. Selain itu, jika Jacek menggunakan Oracle, pertanyaan ini kemungkinan tidak akan muncul :-)
Dean Harding
2
Dean: Anda benar tentang contoh char (1), tapi itu WTF lain, karena '' IS NULLdievaluasi truedalam PL / SQL.
user281377
"Apakah saya benar berasumsi bahwa menggunakan string kosong untuk nilai yang tidak diketahui menyebabkan database" berbohong "tentang fakta?" jika pengguna bisnis Anda tidak peduli dengan yang tidak diketahui vs kosong, apakah kebohongan itu penting?
Andy
Jika Anda harus pergi rute menggunakan string ... tolong, tolong, pastikan itu kosong. Demi semua pengembang, jangan biarkan string dengan spasi di dalamnya mewakili nilai Anda yang tidak diketahui. Saya mohon padamu.
Airn5475

Jawaban:

83

Saya akan mengatakan itu NULLadalah pilihan yang tepat untuk "tidak ada alamat email". Ada banyak alamat email "tidak valid", dan "" (string kosong) hanyalah satu. Misalnya "foo" bukan alamat email yang valid, "a @ b @ c" tidak valid dan sebagainya. Jadi hanya karena "" bukan alamat email yang valid, tidak ada alasan untuk menggunakannya sebagai nilai "tidak ada alamat email".

Saya pikir Anda benar dalam mengatakan bahwa "" bukan cara yang tepat untuk mengatakan "Saya tidak memiliki nilai untuk kolom ini". "" adalah sebuah nilai.

Contoh di mana "" mungkin nilai yang valid, terpisah NULLbisa jadi nama tengah seseorang. Tidak setiap orang memiliki nama tengah, jadi Anda perlu membedakan antara "tidak ada nama tengah" ("" - string kosong) dan "Saya tidak tahu apakah orang ini memiliki nama tengah atau tidak" ( NULL). Mungkin ada banyak contoh lain di mana string kosong masih merupakan nilai yang valid untuk sebuah kolom.

Dean Harding
sumber
5
Setuju. NULL ada karena suatu alasan. SELECT COUNT (*) DARI ANDA DI MANA EMAIL TIDAK [PENUH] NULL adalah cara untuk melakukannya, bukan perbandingan string yang akan cenderung lebih lambat (bahkan untuk string kosong saya kira tapi saya tidak yakin yang satu ini :).
LudoMC
5
Saya pikir NULLtidak berarti bahwa tidak ada alamat email, saya pikir itu berarti bahwa alamat email saat ini tidak diketahui, tidak diketahui keberadaannya, atau tidak mungkin diisi karena alasan lain. Untungnya, mungkin tidak ada situasi di mana seseorang ingin menyimpan dalam database informasi tentang orang-orang yang benar-benar tidak memiliki dan tidak berencana untuk memiliki alamat email, jika tidak, bidang boolean yang terpisah mungkin diperlukan.
Alexey
9
@Alexey - NULL berarti tidak ada nilai. Seperti orang lain menunjukkan string kosong adalah nilai.
Ramhound
3
@Ramhound, saya setuju bahwa string kosong adalah sebuah nilai, dan NULL secara samar berarti "tidak ada nilai". Saya hanya menjelaskan interpretasi saya tentang "tidak ada nilai". Menurut pendapat saya, itu tidak sama dengan "orang tersebut belum membuka akun email apa pun". Itu agak "tidak ada alamat email yang direkam untuk orang itu".
Alexey
5
@Ramhound NULL berarti tidak ada nilai. Seseorang tanpa nama tengah tidak memiliki nilai di sana. Oleh karena itu, NULL harus digunakan di kolom awal tengah juga ... Yang benar-benar berlawanan dengan argumen yang disajikan dalam jawaban ini.
Izkata
41

Sementara setuju dengan komentar di atas, saya akan menambahkan argumen ini sebagai motivasi utama:

  1. Jelas bagi setiap pemrogram yang melihat basis data bahwa bidang bertanda NULL adalah bidang opsional. (yaitu catatan tidak memerlukan data untuk kolom itu)
  2. Jika Anda menandai bidang BUKAN NULL, programmer mana pun harus secara intuitif menganggap bahwa itu adalah bidang yang Diperlukan.
  3. Di bidang yang memungkinkan nulls, programmer harus mengharapkan untuk melihat nulls daripada string kosong.

Demi Self-Documenting Intuitive Coding, gunakan NULL sebagai ganti string kosong.

colinbashbash
sumber
4
+1 Ini adalah argumen "paling mencengangkan" sehubungan dengan pengembang terhadap string kosong. Tidak ada pengembang yang datang nanti akan berharap bahwa string kosong akan digunakan untuk mewakili "tidak ada alamat email".
Thomas
6

Dalam contoh Anda jika nilai langsung dari bidang web - saya akan menggunakan string kosong. Jika pengguna dapat opsi untuk menentukan bahwa ia tidak ingin memberikan email, atau bisa menghapusnya - maka NULL.

Berikut ini tautan dengan poin yang dapat Anda pertimbangkan: https://stackoverflow.com/questions/405909/null-vs-empty-when-dealing-with-user-input/405945#405945

--- diedit (Membalas komentar Thomas) ---

Basis data tidak hidup tanpa aplikasi yang menggunakannya. Menentukan NULL atau '' tidak memiliki nilai, jika aplikasi tidak dapat menggunakannya dengan benar.

Pertimbangkan satu contoh di mana pengguna mengisi formulir PANJANG dan tekan enter, yang akan mengirim permintaan tetap ke server. Dia mungkin berada di tengah memasukkan emailnya. Kemungkinan besar Anda ingin menyimpan apa pun yang dia miliki di bidang email, sehingga nanti dia bisa menyelesaikannya. Bagaimana jika dia hanya memasukkan satu karakter? Bagaimana jika dia memasukkan satu karakter dan kemudian menghapusnya? Ketika email tidak diperlukan, kadang-kadang pengguna ingin menghapusnya: cara termudah untuk menghapus bidang. Juga dalam hal ketika email tidak diperlukan, ada baiknya untuk memvalidasi sebelum mengirim.

Contoh lain: pengguna memberikan email sebagai spam ke @ [perusahaan besar] .com - dalam hal ini tidak perlu mengirim email, meskipun itu ada dan valid (dan bahkan mungkin ada). Mengirim yang satu mungkin murah, tetapi jika ada 10 ribu pengguna dengan email seperti itu untuk langganan harian, maka validasi seperti itu dapat menghemat banyak waktu.

Konstantin Petrukhnov
sumber
7
-1. Apakah basis data menggerakkan situs web atau tidak, tidak relevan. Mendesain basis data adalah dunia yang berbeda dari desain web. Basis data harus dirancang untuk menangkap fakta tentang domain bisnis yang independen dari antarmuka yang digunakan untuk menulis. Menurut logika Anda, haruskah Anda menggunakan nulls jika kebetulan aplikasi pertama adalah executable? Apa yang terjadi jika aplikasi pertama adalah aplikasi web tetapi aplikasi berikutnya adalah aplikasi seluler? Rancang basis data untuk menangkap fakta menggunakan aturan normalisasi dan rancang situs web untuk menulisnya.
Thomas
Saya senang Anda belajar menulis dan mengomentari situs ini :) Saya masih percaya bahwa DB harus mendukung aplikasi yang menggunakannya. Periksa jawaban saya yang diedit.
Konstantin Petrukhnov
4
Basis data tidak hidup tanpa aplikasi yang menggunakannya. Dalam pengalaman saya, ini tidak benar dan picik. Hampir selalu database digunakan di luar aplikasi yang dirancangnya. Secara umum, database bertahan lebih lama dari aplikasi yang dibangun. Basis data harus dirancang untuk mengumpulkan fakta tentang bisnis dan UI harus dibangun untuk membaca dan menulis ke basis data bukan sebaliknya. Desain relasional adalah pola pikir yang sama sekali berbeda dari desain aplikasi.
Thomas
2
Contoh di mana basis data tidak hanya digunakan oleh aplikasi asli : laporan, integrasi dengan sistem lain.
Thomas
1
Seperti yang ditunjukkan Thomas, DB dapat dan sering digunakan oleh lebih dari satu aplikasi yang menambah bobot pada gagasan menjaga data DB Anda tetap bersih. Jika Anda tidak ingin / tidak dapat menangani NULL dalam aplikasi Anda, maka Anda dapat dengan mudah menggantinya dengan "nilai ajaib" Anda (deskripsi bagus Thomas) di lapisan akses data Anda. Dengan cara ini, setiap aplikasi masa depan yang ingin mengakses DB tidak perlu tahu tentang / menyesuaikan dengan nilai-nilai ajaib aplikasi asli.
bendemes
5

Saya pikir jawaban Dean Hardings mencakup ini dengan sangat baik. Yang mengatakan saya ingin menyebutkan bahwa ketika berbicara tentang string NULL vs kosong di tingkat DB Anda harus memiliki pemikiran tentang tipe data Anda yang lain. Apakah Anda menyimpan tanggal minimum ketika tidak ada tanggal yang disediakan? atau -1 ketika tidak ada int yang disediakan? Menyimpan nilai ketika Anda tidak memiliki nilai berarti Anda harus melacak seluruh jajaran nilai yang tidak ada. Setidaknya satu untuk setiap tipe data (mungkin lebih banyak ketika Anda mendapatkan kasus di mana -1 adalah nilai aktual sehingga Anda perlu memiliki beberapa alternatif dll). Jika Anda perlu / ingin melakukan sesuatu yang "fudgy" pada tingkat aplikasi itu adalah satu hal tetapi mereka tidak perlu mencemari data Anda.

bendemes
sumber
2
+1 - Inilah yang saya sebut "Solusi Nilai Ajaib". Kami harus datang dengan nilai ajaib untuk setiap tipe data untuk mewakili tidak adanya nilai. Selain itu, dalam beberapa kolom nilai sihir umum adalah atau menjadi nilai yang sah dan karenanya nilai sihir baru diperlukan.
Thomas
5

Sayangnya, Oracle bingung dengan representasi string VARCHAR dengan panjang nol dengan representasi NULL. Keduanya diwakili secara internal oleh satu byte dengan nilai nol. Ini membuat diskusi menjadi lebih sulit.

Banyak kebingungan seputar pusat-pusat NULL di sekitar logika bernilai tiga . Pertimbangkan kodesemu berikut:

if ZIPCODE = NULL
    print "ZIPCODE is NULL"
else if ZIPCODE <> NULL
    print "ZIPCODE is not NULL"
else print "Something unknown has happened"

Anda tidak akan mengharapkan pesan ketiga, tetapi itulah yang akan Anda dapatkan, di bawah tiga logika yang dihargai. Tiga logika yang dihargai mengarahkan orang ke banyak bug.

Sumber kebingungan lainnya adalah menarik kesimpulan dari tidak adanya data, seperti menarik kesimpulan dari anjing yang tidak menggonggong di malam hari. Seringkali kesimpulan ini bukan yang dimaksudkan oleh penulis dari NULL.

Karena itu, ada banyak situasi di mana NULL menangani tidak adanya data dengan baik, dan menghasilkan persis hasil yang Anda inginkan. Salah satu contoh adalah kunci asing dalam hubungan opsional. Jika Anda menggunakan NULL untuk menunjukkan tidak ada hubungan dalam baris yang diberikan, baris itu akan keluar dari gabungan dalam, seperti yang Anda harapkan.

Perlu diketahui juga bahwa meskipun Anda menghindari NULLS sepenuhnya dalam data yang disimpan (bentuk normal keenam), jika Anda melakukan penggabungan luar, Anda masih harus mengatasi NULLS.

Walter Mitty
sumber
4

Gunakan Null.

Tidak ada gunanya menyimpan nilai '', ketika hanya membuat bidang dalam tabel nullable akan dilakukan. Itu membuat pertanyaan lebih jelas juga.

Query SQL manakah yang lebih jelas dan dapat dibaca jika Anda ingin menemukan pengguna dengan alamat email?

  1. SELECT * FROM Users WHERE email_address != ''

  2. SELECT * FROM Users WHERE email_address IS NOT NULL

  3. SELECT * FROM Users WHERE email_address != '' and email_address IS NOT NULL

Saya akan mengatakan 2 adalah. Meskipun 3 lebih kuat dalam kasus di mana ada data buruk disimpan.

Untuk kasus alamat email pada formulir, yang merupakan opsional, itu harus tercermin dalam tabel juga. Dalam SQL, ini adalah bidang nullable, yang artinya tidak diketahui.

Saya tidak bisa memikirkan nilai bisnis yang masuk akal dalam menyimpan string kosong di tabel selain dari desain yang buruk. Ini seperti menyimpan nilai string 'NULL' atau 'BLANK', dan membuat pengembang menganggap bahwa itu null atau string kosong. Bagi saya, itu desain yang buruk. Mengapa menyimpannya ketika ada NULL ??

Cukup gunakan NULL, dan Anda akan membuat semua orang sedikit lebih bahagia.

INFO LEBIH LANJUT:

SQL menggunakan sistem logika tiga nilai: Benar, Salah, dan Tidak Dikenal.

Untuk penjelasan yang lebih baik dan lebih detail, saya sarankan pengembang untuk membaca: SQL Queries - di luar TRUE dan FALSE .

sepon
sumber
3

untuk pertanyaan teknis spesifik, masalahnya bukan null vs string kosong, ini adalah kegagalan validasi . String kosong bukan alamat email yang valid!

untuk pertanyaan filosofis, jawabannya serupa: validasi input Anda. Jika string kosong adalah nilai yang valid untuk bidang yang dimaksud, maka harapkan dan berikan kode untuknya; jika tidak, gunakan null.

String kosong akan menjadi input yang valid untuk menjawab pertanyaan: Apa yang dikatakan oleh pantomim kepada jerapah?

Steven A. Lowe
sumber
Bahkan dengan niat terbaik di dunia, validasi mungkin tidak menyelesaikan masalah ini - ia mungkin masih harus menggunakan metode yang berhubungan dengan baris di mana semua kolom harus diberikan semacam nilai. Dalam hal itu, pertanyaannya akan tetap ada - nilai apa yang digunakan ketika tidak ada nilai? Dan jawabannya tentu saja adalah: nilai yang menunjukkan tidak ada nilai. Dalam DBs ini biasanya NULL.
jmoreno
2

Saya bisa memikirkan alasan memiliki NULL dan string kosong:

  • Anda memiliki alamat email yang valid: [email protected]
  • Anda tidak memilikinya (dan mungkin harus meminta satu): NULL
  • Anda tahu bahwa orang ini tidak memiliki alamat email: Empty String.

Namun saya tidak akan merekomendasikan itu dan menggunakan bidang yang terpisah untuk apakah akan bertanya apakah Anda tahu tidak ada.

Marcel
sumber
1

Pertanyaan seperti yang saya pahami, adalah interpretasi NULL dan string kosong mana yang harus dipilih. Ini tergantung pada berapa banyak negara bagian bidang yang bisa dimasukkan.

Interpretasi tergantung pada bagaimana database diakses. Jika ada lapisan dalam kode yang mengabstraksi database sepenuhnya, daripada memilih kebijakan apa pun (termasuk dua-coulmn) yang berfungsi benar-benar dapat diterima. (Namun, jelas mendokumentasikan kebijakan itu penting). Namun, jika database sedang diakses di beberapa tempat, maka Anda harus menggunakan skema yang sangat sederhana, karena kode akan lebih sulit untuk dipelihara dan mungkin keliru dalam hal ini.

apoorv020
sumber
1

Yah pada dasarnya pada level logis tidak ada perbedaan antara nilai "tidak valid" dan "tidak ada input pengguna", mereka hanya semua "kasus khusus" sebagian besar waktu. Kasus kesalahan.

Memiliki null membutuhkan ruang tambahan: ceil (kolom_with_null / 8) dalam byte / per baris.

Sel kosong dan nol keduanya adalah cara untuk menandai ada sesuatu yang salah / harus default. Mengapa Anda membutuhkan 2 status "salah"? Mengapa menggunakan NULLs jika mereka mengambil ruang tambahan dan berarti persis sama dengan string kosong? Itu hanya akan menimbulkan kebingungan dan redundansi ketika Anda memiliki dua hal yang artinya (itu bisa berarti) persis sama, mudah untuk melupakan bahwa Anda harus menggunakan NULLs daripada string kosong (jika misalnya pengguna mengabaikan beberapa bidang).

Dan data Anda bisa berantakan. Di dunia yang sempurna Anda akan mengatakan "data akan selalu benar dan saya akan mengingat" ... tetapi ketika orang harus bekerja dalam tim dan tidak semua orang tepat pada level Anda, tidak jarang untuk melihat DIMANA (aa. xx <> '' DAN bb.zz BUKAN NULL)

Jadi alih-alih mengoreksi anggota tim saya setiap hari saya hanya menegakkan aturan sederhana. Tidak ada nilai nol, TIDAK PERNAH!

Menghitung nilai NON-NULL lebih cepat ... pertanyaan sederhana adalah apa yang perlu Anda lakukan untuk itu?

Slawek
sumber
Saya samar-samar ingat membaca di suatu tempat bahwa menggunakan NULL sebenarnya adalah biaya (baik dalam hal perhitungan dan penyimpanan) untuk database. Jadi poin yang bagus untuk menaikkan formula itu.
Jacek Prucia
Jangan lupa bahwa VARCHARkolom akan membutuhkan setidaknya 1 byte untuk menyimpan panjang string, bahkan jika itu nol.
dan04
Sel kosong dan nol keduanya merupakan cara untuk menandai ada sesuatu yang salah . Tidak benar. Nol adalah cara untuk menunjukkan tidak adanya nilai. Saya yakin sebagian besar RDBMS menggunakan bit array pada setiap baris untuk menunjukkan kolom mana yang nol. Dengan demikian, ruang tambahan sangat kecil sehingga tidak relevan. Khawatir tentang pemrosesan tambahan adalah optimasi prematur dan tidak akan ada apa-apanya dibandingkan dengan gundukan kecepatan yang dibuat untuk pengembang lain untuk "menemukan" bahwa Anda secara sengaja menggunakan string kosong.
Thomas
3
Tidak ada nilai nol . Ini adalah pendekatan burung unta. "Kami akan menempelkan kepala kami di pasir dan menyatakan bahwa nilai absen tidak ada". Itu biasanya mengarah ke Solusi Nilai Ajaib di mana Anda harus datang dengan nilai ajaib untuk setiap tipe data untuk mewakili tidak adanya nilai.
Thomas
1

Saya cenderung melihatnya bukan dari perspektif DB tetapi dari perspektif program. Saya tahu bahwa pertanyaan ini adalah untuk klik SQL tetapi sungguh, berapa banyak pengguna yang mengakses data secara langsung lebih lama?

Dalam sebuah program saya tidak suka null / nothing. Ada beberapa pengecualian tetapi hanya itu saja. Dan pengecualian itu benar-benar implementasi yang buruk.

Jadi, jika pengguna tidak memasukkan email itu, harus ada sesuatu yang menentukan apakah ini valid atau tidak. Jika email kosong baik-baik saja maka itu akan menampilkan string kosong. Jika pengguna tidak memasukkan email dan itu melanggar aturan, objek harus menunjukkan ini.

Gagasan nol memiliki makna adalah sekolah lama dan merupakan sesuatu yang harus diprogram oleh programmer modern.

Bahkan dalam desain DB mengapa bidang email tidak dapat mengizinkan nol dan memiliki string panjang nol dan memiliki bidang lain yang menunjukkan jika pengguna memasukkan sesuatu? Apakah sedikit banyak yang meminta DBMS? Menurut saya, DB seharusnya tidak menangani logika bisnis maupun logika tampilan. Itu tidak dibangun untuk itu dan dengan demikian melakukan pekerjaan yang sangat buruk untuk menanganinya.

ElGringoGrande
sumber
mengapa bidang email tidak dapat mengizinkan nol dan memiliki string panjang nol - Sederhananya: karena setiap pengembang yang tahu apa-apa tentang basis data tidak akan pernah berharap bahwa string kosong memiliki makna sihir. Anda mencoba untuk membuat nilai ajaib Anda sendiri untuk mewakili apa yang secara fundamental sudah ada di setiap basis data: sebuah konsep untuk mewakili ketiadaan nilai. Mengapa menemukan kembali roda? Juga, ide NULLS adalah jauh, jauh, jauh dari sekolah lama. Nulls adalah kunci untuk memahami desain basis data relasional.
Thomas
LOL. Seperti saya katakan dari sudut pandang programmer nol hampir selalu menyebalkan dan hampir tidak pernah diperlukan untuk LOGIN BISNIS. Saya pribadi, sebagai pengembang, tidak terlalu peduli dengan desain relasional. Jika saya melakukannya saya akan menjadi dude DB. Jika saya mendapatkan null dari DB, saya hampir selalu mengonversinya menjadi sesuatu yang rasional, seperti string kosong kemudian biarkan desain OOP saya yang mulia melakukan itu sihir. Kerangka kerja ini menangani kekuatan-kekuatan DBA nol yang konyol itu terhadap dunia. Saya tahu DB dudes harus menghadapinya dan saya rasakan untuk Anda. Tetapi sebagai seorang programmer saya tidak harus melakukannya. Saya punya solusi yang lebih baik.
ElGringoGrande
Anda "tidak pernah" harus berurusan dengan nol. Jadi, yang Anda gambarkan adalah solusi burung unta yang dikombinasikan dengan solusi nilai ajaib. "Saya akan mengabaikan fakta bahwa tidak ada nilai dan saya akan mengonversi semua bilangan bulat nol menjadi -1". Hingga saatnya tiba ketika -1 adalah nilai nyata. Perlu dicatat bahwa salah satu alasan MS menambahkan obat generik ke .NET adalah untuk mengatasi ketidakcocokan impedansi besar antara database dan kode aplikasi dan yang terutama berkisar pada pengekspresian nulls dalam kode tingkat menengah. "Nol konyol" itu juga ada dalam logika bisnis.
Thomas
Fakta bahwa beberapa integer tidak ada dalam db (atau nol) tidak berarti saya harus mewakilinya dengan -1 atau evan nullable (int). Jika Anda berpikir itu adalah satu-satunya cara untuk menangani nol maka Anda tidak mengerti pemrograman dengan baik. Ingat null bukan hal yang sama dengan nol. Seperti yang Anda katakan, null merupakan tempat penampung untuk nilai yang tidak ada di beberapa jenis struct data. Itu berarti sesuatu. Logika bisnis jarang (yang tidak sama dengan tidak pernah) membutuhkan konsep ini karena ini tentang perilaku, bukan data. Dan ketika itu nol, jarang ada cara terbaik untuk mewakili hal ini.
ElGringoGrande
Bahkan logika bisnis harus memperhitungkan (berarti mewakili) nilai yang tidak ada dan itu benar dalam pengalaman saya, di hampir setiap sistem yang saya lihat atau bangun dalam 20 tahun terakhir. Basis data memodelkan fakta bisnis untuk ditangkap dan disimpan. Jika logika bisnis ingin dapat berinteraksi dengan database, ia harus tahu cara menangani nol. Apakah itu struct kustom, nilai sihir, atau generik tidak relevan. Logika bisnis membutuhkan kemampuan untuk menangani penerimaan nilai absen dari database dan kemampuan untuk menandai nilai sebagai absen ke database.
Thomas
-1

Saya tidak berpikir itu penting, tapi saya lebih suka kalau NULL ada di sana.

Ketika saya melihat data yang ditampilkan dalam tabel (seperti di SQL Server Management Studio), saya bisa lebih baik membedakan nilai yang hilang jika ia mengatakan NULL dan latar belakang berwarna berbeda.

Jika saya melihat ruang kosong, saya selalu bertanya-tanya apakah itu benar-benar kosong atau ada beberapa spasi putih atau beberapa karakter yang tidak terlihat. Dengan NULL dijamin kosong pada pandangan pertama.

masukkan deskripsi gambar di sini

Saya biasanya tidak membedakan nilai-nilai dalam aplikasi, karena itu tak terduga dan aneh bahwa NULL dan string kosong akan berarti sesuatu yang berbeda. Dan sebagian besar waktu, saya mengambil pendekatan defensif dan hanya berurusan dengan kedua negara. Tapi bagi saya sebagai manusia, NULL lebih mudah diproses saat melihat data.

Tom Pažourek
sumber
ini tampaknya tidak menawarkan sesuatu yang substansial atas poin yang dibuat dan dijelaskan dalam 12 jawaban sebelumnya
nyamuk
@gnat: Saya tidak setuju, tidak ada dalam jawaban yang menyebutkan aspek manusia melihat data. Hanya ada satu nilai NULL, tetapi bisa ada banyak nilai yang terlihat seperti string kosong (tidak hanya spasi, tetapi ada banyak karakter unicode yang berperilaku aneh juga). Saya tidak dapat melihat jawaban lain yang menyebutkan aspek masalah ini.
Tom Pažourek
sejauh yang saya tahu ini cukup baik diletakkan di jawaban atas kedua yang diposting 5 tahun yang lalu: "Jelas bagi setiap programmer melihat database ..." etc
gnat
@gnat: Saya mengerti maksud Anda, meskipun saya pikir penulisnya tidak bermaksud hal yang sama. Saya percaya dia lebih tentang NULL yang menyiratkan bidang opsional, tetapi string kosong dapat digunakan untuk bidang yang diperlukan juga, sehingga NULL lebih logis untuk nilai yang hilang. Aku setuju dengannya. Tetapi jawaban saya menunjuk pada fakta bahwa string kosong tidak seambigu nilai NULL, karena banyak hal dapat terlihat seperti string kosong pada pandangan pertama sementara sebenarnya bukan string kosong.
Tom Pažourek