Alamat email unik atau kunci utama?

11

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?

aanda
sumber
3
Apa yang terjadi ketika seorang pengguna mengubah alamat emailnya - karena mereka akan mis mengubah pekerjaan
user151019
1
Perbandingan string tidak hanya lebih lambat, string juga cenderung lebih besar daripada katakanlah, integer, dan karenanya Anda dapat memuat lebih sedikit pada halaman dalam memori, mendorong pembacaan logis Anda untuk pertanyaan.
Nameless One

Jawaban:

7

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:

create table A ( x ... not null
               , y ... not null
               , z ... not null
               ,     unique (x)
               ,     primary key (y,z) );

create table B ( x ...
               ,   ...
               ,     foreign key (x) references A (x) );

create table C ( y ...
               , z ...
               ,   ...
               ,     foreign key (y, z) references A (y, z) );  

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.

Lennart
sumber
1
Dalam SQL Server Anda dapat merujuk indeks unik sebagai FK.
Martin Smith
1
Saya tidak memiliki akses ke sql jadi saya tidak dapat memeriksa sendiri, apakah ini secara implisit membuat kendala unik ketika Anda membuat indeks yang unik?
Lennart
1
Tidak. Batasan unik diperlakukan sedikit berbeda dan memiliki beberapa metadata tambahan dan batasan tambahan dibandingkan dengan indeks unik tetapi SQL Server memungkinkan untuk digunakan di FK.
Martin Smith
1
Itu agak aneh kemudian, indeks bahkan tidak disebutkan dalam standar sql sedangkan kunci adalah bagian sentral dari itu. Bagaimanapun, terima kasih atas informasinya.
Lennart
Perlu dicatat bahwa jika ada banyak catatan yang dikunci orang asing untuk email Anda, mungkin perlu sedikit waktu untuk memperbarui semua catatan itu ketika pembaruan mengalir.
cimmanon
6

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.

mrdenny
sumber
1
Itu tidak benar tentang SQL server. Anda dapat membuat indeks dengan whereklausa yang, misalnya, memungkinkan Anda untuk mengecualikan NULLnilai dari indeks.
Kirk Woll
1
Pernyataan SQL Server allows a single NULL valueitu masih benar. Itu tidak mengatakan tidak ada cara untuk mendapatkan beberapa NULLnilai. Saya pikir jawaban-er berusaha untuk menjaga jawabannya tetap sederhana dan tidak menjelaskan rincian tambahan (seperti diindeks diindeks).
Brandon
1
Ya saya bisa turun kelinci seluruh indeks yang difilter tetapi pertanyaan sederhana biasanya membutuhkan jawaban sederhana. Tanpa platform dan versi basis data, saya menyimpan jawaban saya secara umum.
mrdenny
2

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.

vijayp
sumber