Setiap kisah hebat dimulai dengan krisis identitas. Luke, Jedi Master yang hebat, mulai tidak yakin - "Siapa aku?" - dan bagaimana saya bisa menjadi orang penting? Dibutuhkan Yoda, yang memiliki Force, untuk mengajarinya cara memanfaatkan kekuatannya.
Hari ini, biarkan aku menjadi Yoda-mu.
Kita akan mulai dengan cara memilih Kunci Utama, melawan krisis identitas, dan kemudian menyelesaikan dengan contoh kode untuk membuat Kunci Utama dalam database.
Cara Memilih Kunci Utama
Anda mungkin berpikir Luke adalah satu-satunya yang mengalami krisis identitas, tapi itu tidak benar. Saat membuat database, semuanya berada dalam krisis identitas. Dan itulah mengapa kita membutuhkan kunci utama:mereka menyelesaikan krisis. Mereka memberi tahu kami cara menemukan semua orang.
Bayangkan Anda adalah pemerintah, dan Anda ingin mengidentifikasi setiap warga negara Anda secara digital. Jadi, Anda membuat database ini dengan segala sesuatu tentang mereka:
First Name
Last Name
Passport Number
Anda memilih Nomor paspor sebagai Kunci Utama - identitas untuk semua orang. Anda pikir hanya itu yang Anda butuhkan karena paspor memiliki alamat dan yang lainnya. Anda tahu nomor paspor itu unik, jadi Anda merasa nyaman dan menerapkan sistem ini.
Kemudian, beberapa tahun kemudian, Anda menemukan kebenaran yang buruk:seluruh negara menghadapi krisis identitas.
Setiap kali paspor seseorang kedaluwarsa, mereka mendapatkan yang baru. Identitas mereka berubah. Sistem lain tetap menggunakan nomor paspor lama, jadi sekarang mereka menunjuk ke orang hantu.
Keunikan saja tidak cukup. Nilai tidak boleh berubah sepanjang masa pakai baris.
Dan kemudian, Anda menemukan ada beberapa orang yang bahkan tidak memiliki paspor. Anda tidak dapat memasukkannya ke dalam sistem Anda, karena Kunci Utama tidak boleh NULL
. Bagaimana Anda bisa mengidentifikasi seseorang dengan NULL
kunci?
Setiap baris harus memiliki pengenal. NULL tidak diizinkan.
Iterasi berikutnya berarti menemukan pengenal yang tidak berubah seiring waktu, dan pengenal yang dimiliki setiap orang. Di India, ini berubah menjadi Kartu Adhaar. Di AS, Nomor Jaminan Sosial.
Jika Anda membuat database, jadikan itu sebagai kunci utama Anda.
Terkadang, Anda tidak memiliki kunci seperti itu. Pertimbangkan negara yang belum memiliki Nomor Jaminan Sosial, dan mereka ingin membuat catatan digital setiap warga negara. Mereka dapat membuat SSN baru, atau mereka dapat memanfaatkan kekuatan database, dan menggunakan kunci pengganti.
Kunci pengganti tidak memiliki padanan dunia nyata. Itu hanya nomor di dalam database. Jadi, Anda memiliki tabel ini di negara baru:
userID
First Name
Last Name
Passport Number
Nomor Paspor unik. Kapan pun Anda ingin mendapatkan pengenal untuk pengguna, Anda bisa mendapatkannya melalui Nomor Paspor.
UserID tidak pernah berubah. Nomor Paspor dapat berubah - tetapi selalu unik, sehingga Anda selalu mendapatkan pengguna yang tepat. ID pengguna adalah pengganti untuk Nomor Jaminan Sosial yang tidak ada di negara ini.
Fakta menarik:Nomor Paspor di sini juga merupakan Kunci Kandidat. Itu bisa menjadi Kunci Utama, jika tidak pernah berubah. Ini adalah perbedaan logika bisnis.
Kesimpulan utamanya adalah ini:Kapan pun Anda memilih Kunci Utama, pikirkan krisis identitas . Mungkinkah seseorang mengubah pengenalnya di masa mendatang? Bisakah kita masuk ke keadaan dengan banyak orang yang memiliki pengenal yang sama?
Saya menggunakan orang sebagai contoh, karena itu membuat identitas lebih jelas - kita tahu setiap orang seharusnya memiliki identitas. Transfer pemikiran ini ke database Anda. Semuanya memiliki identitas, itulah sebabnya Anda membutuhkan Kunci Utama.
Catatan:Terkadang, mungkin, dan diinginkan untuk menggunakan beberapa kolom bersama-sama sebagai Kunci Utama. Ini adalah Kunci Gabungan.
Sekarang mari kita coba mendefinisikan Kunci Utama dengan contoh kode nyata. Ada dua hal yang harus dilakukan di sini:pertama, Anda akan mengidentifikasi Kunci Utama. Kemudian, Anda akan mempelajari sintaks untuk mendefinisikannya dalam database.
Contoh dunia nyata
Katakanlah Anda menjalankan startup pengiriman, seperti halnya Flexport. Anda memiliki paket yang perlu dibawa dari satu tempat ke tempat lain, dan kapal yang mengangkutnya. Selanjutnya, Anda memiliki pelanggan yang memesan paket ini.
Anda akan membutuhkan satu meja untuk pelanggan, satu untuk paket, dan satu untuk transportasi, menunjukkan paket mana yang ada di mana sekarang.
Pikirkan kolom apa yang Anda perlukan, dan apa yang harus menjadi Kunci Utama. Jika Anda seorang insinyur di Flexport, ini adalah pertanyaan aktual yang harus Anda cari tahu. Tidak ada yang diberikan, semuanya ditemukan di dunia nyata.
Dengan informasi ini, saya akan mendesain tabel ini seperti ini:
Customers: first_name, last_name, email, address (for deliveries to their location)
Packages: weight, content
Transportation: <package_primary_key>, Port, time
Kami kehilangan kunci utama. Pikirkan tentang mereka sebelum membaca lebih lanjut.
Untuk paket, saya akan memilih pengganti ID Paket. Saya bisa mencoba membuat daftar semua atribut paket:berat, volume, kepadatan, usia. Mereka akan secara unik mengidentifikasi paket, tetapi ini sangat sulit dilakukan dalam praktiknya. Orang-orang tidak peduli tentang ini, mereka hanya peduli tentang paket yang dikirim dari satu tempat ke tempat lain.
Jadi, masuk akal untuk membuat nomor acak dan menggunakannya sebagai ID. Inilah tepatnya mengapa Anda melihat FedEx, UPS, dan setiap layanan pengiriman menggunakan kode batang dan ID. Ini adalah kunci pengganti yang dibuat untuk melacak paket.
Untuk pelanggan, saya akan memilih pengganti ID Pelanggan. Di sini, sekali lagi, saya memiliki pilihan untuk memilih, katakanlah, Nomor Jaminan Sosial pelanggan saya. Tetapi, pelanggan tidak ingin membagikan ini dengan saya hanya agar saya dapat mengirimkan sesuatu kepada mereka. Jadi, kami membuat kunci secara internal, tidak memberi tahu pelanggan kami tentang kunci ini, dan terus memanggil mereka CustomerNo. 345681.
Kisah Seru:Saya tahu beberapa perusahaan tempat mereka mengekspos CustomerNo ini, dan pelanggan bersikeras mereka mendapatkan No. 1. Itu cukup lucu - para insinyur benar-benar harus mengubah kode front-end mereka menjadi:if (cust == 345681) print(1);
Untuk Transportasi, saya akan memilih komposit PackageID+Port+waktu. Ini sedikit lebih menarik. Saya bisa saja membuat pengganti di sini juga, dan itu akan bekerja dengan baik.
Tapi, di sinilah letak keajaiban pengindeksan. Kunci Utama mendapatkan indeks secara otomatis, yang berarti pencarian jauh lebih efisien daripada Kunci Utama.
Saat Anda mencari melalui database ini, sebagian besar kueri akan berbentuk "di mana paket ini?". Dengan kata lain, dengan PackageID ini, beri tahu saya Port dan Waktu saat ini. Saya akan membutuhkan indeks tambahan di atas PackageID jika saya tidak memilikinya sebagai bagian dari Kunci Utama saya.
Apakah ini terdengar bagus? Langkah terakhir, mari kita definisikan 3 tabel ini dalam SQL. Sintaksnya sedikit berbeda dengan database yang Anda gunakan.
Mendefinisikan Kunci Utama di MySQL
CREATE TABLE customers
( customerID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(25) NOT NULL,
email VARCHAR(50) NOT NULL,
address VARCHAR(300)
);
CREATE TABLE packages
( packageID INT(15) NOT NULL AUTO_INCREMENT,
weight DECIMAL (10, 2) NOT NULL,
content VARCHAR(50),
CONSTRAINT packages_pk PRIMARY KEY (packageID) # An alternative way to above,
# when you want to name the constraint as well.
);
CREATE TABLE transportation
( package INT(15) NOT NULL,
port INT(15) NOT NULL,
time DATE NOT NULL,
PRIMARY KEY (package, port, time),
FOREIGN KEY package
REFERENCES packages(packageID)
ON DELETE RESTRICT # It's good practice to define what should happen on deletion. In this case, I don't want things to get deleted.
);
Mendefinisikan Kunci Utama di PostgreSQL
CREATE TABLE customers
( customerID SERIAL NOT NULL PRIMARY KEY, # In PostgreSQL SERIAL is same as AUTO_INCREMENT - it adds 1 to every new row.
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR(25) NOT NULL,
address TEXT,
email VARCHAR(50) NOT NULL
);
CREATE TABLE packages
( packageID SERIAL NOT NULL,
weight NUMERIC NOT NULL,
content TEXT,
CONSTRAINT packages_pk PRIMARY KEY (packageID) # In PostgreSQL, this alternative way works too.
);
CREATE TABLE transportation
( package INTEGER NOT NULL,
port INT(15) NOT NULL,
time DATE NOT NULL,
PRIMARY KEY (package, port, time),
FOREIGN KEY package
REFERENCES packages(packageID)
ON DELETE RESTRICT # It's good practice to define what should happen on deletion. In this case, I don't want things to get deleted.
);
Tidak jauh berbeda, bukan? Setelah Anda memahami dasar-dasarnya, Anda dapat menerapkannya ke hampir semua database hanya dengan melihat dokumentasinya. Kuncinya adalah mengetahui apa yang harus dicari!
Semoga beruntung, padawan muda.
Menikmati ini? Anda mungkin juga menyukai Hal yang Saya Pelajari dari Insinyur Perangkat Lunak Senior