Saya seorang pemula dalam database. Saya membaca sekitar dan menemukan bahwa mungkin bukan ide yang bagus untuk menggunakan alamat email sebagai kunci utama karena perbandingan string lebih lambat yang mempengaruhi kinerja dalam gabungan kompleks dan jika email berubah saya harus mengubah semua kunci asing yang membutuhkan banyak usaha.
Tetapi jika tabel pengguna saya mengharuskan setiap pengguna untuk memiliki alamat email dan masing-masing alamat email tersebut harus unik, apakah menambahkan indeks unik pada kolom email sudah cukup? Karena bidang unik afaik memungkinkan nilai nol, sedangkan saya meminta setiap pengguna memiliki alamat email, tidak mengizinkan nilai nol. Apakah ada sesuatu yang saya lewatkan di sini? Atau saya kira membuat kolom email unik dan memastikan selama validasi data di server bahwa pengguna memasukkan alamat email sehingga setiap pengguna memiliki satu?
Jawaban:
Pertama mari kita bedakan antara kunci dan indeks, kunci adalah bagian dari model logis dan sering diimplementasikan dengan indeks yang unik. Namun Anda dapat membuat indeks unik tanpa membuat kunci, tetapi itu tidak dapat dirujuk oleh kunci asing.
Kunci kandidat adalah sesuatu yang secara unik mengidentifikasi sebuah baris dalam sebuah tabel, dalam SQL salah satu kunci kandidat biasanya digunakan sebagai kunci primer (saya tidak pernah benar-benar mengerti mengapa salah satu ck dianggap "lebih baik" daripada yang lain, tapi itu yang lain cerita), dan ck yang tersisa menjadi kendala unik.
Batasan unik dapat digunakan dengan cara yang sama seperti kunci primer. Mempertimbangkan:
B referensi batasan unik dan C referensi batasan kunci utama.
BUKAN NULL adalah jenis kendala lainnya. Dalam kasus Anda, Anda dapat menerapkan ini untuk email tanpa menyatakannya unik.
Aspek berikutnya dari posting Anda menyangkut stabilitas kunci, kunci harus stabil (tapi itu tidak berarti itu tidak pernah bisa berubah, itu tidak harus tidak berubah). Beberapa DBMS mengimplementasikan ON UPDATE CASCADE yang dapat membantu operasi semacam itu, tetap saja jika kunci tersebut didistribusikan di sekitar model Anda, akan sangat sulit memperbaruinya.
Dalam kasus Anda, saya mungkin akan memilih kunci kandidat lain sebagai kunci utama, dan menyatakan email sebagai TIDAK NULL dan UNIK.
sumber
Ya memiliki indeks unik di kolom Alamat Email harus ok. Satu-satunya masalah adalah jika seseorang memberikan alamat email setelah mendaftar untuk layanan Anda tetapi tidak memberi tahu Anda, maka siapa pun pemilik alamat email tersebut mencoba mendaftar. Tapi itu kasus tepi yang cukup langka.
Mengenai apakah Indeks Unik memungkinkan nilai nol yang akan bergantung pada platform database Anda. Oracle tidak, SQL Server memungkinkan nilai NULL tunggal. Anda dapat menyelesaikan ini dengan membuat kolom tidak mengizinkan nilai NULL, lalu membangun indeks unik di atasnya.
sumber
where
klausa yang, misalnya, memungkinkan Anda untuk mengecualikanNULL
nilai dari indeks.SQL Server allows a single NULL value
itu masih benar. Itu tidak mengatakan tidak ada cara untuk mendapatkan beberapaNULL
nilai. Saya pikir jawaban-er berusaha untuk menjaga jawabannya tetap sederhana dan tidak menjelaskan rincian tambahan (seperti diindeks diindeks).Memiliki indeks unik di EmailAddress tidak masalah.
Seperti yang telah Anda nyatakan bahwa ada validasi dalam aplikasi Anda karena memiliki Alamat Email sebagai bidang wajib, saya akan katakan karena validasi lainnya dari database tidak menerima pengguna tanpa alamat Email dan mencegah duplikat entri juga dan validasi ini akan dikenakan dengan Indeks Unik ini.
Seperti yang dinyatakan dalam jawaban lain untuk SQL Server Anda perlu membuat kolom tidak mengizinkan nilai nol sebelum membangun indeks unik.
sumber