Siapapun yang telah mengembangkan aplikasi web kecil berbasis database menggunakan MySQL tahu bahwa membuat, mengambil, memperbarui, dan menghapus tabel dalam database relasional adalah proses yang relatif sederhana. Secara teoritis, selama Anda menguasai penggunaan pernyataan SQL yang paling umum dan akrab dengan bahasa skrip sisi server yang Anda pilih, itu sudah cukup untuk menangani berbagai operasi yang diperlukan pada tabel MySQL, terutama ketika Anda menggunakan MyISAM yang cepat. mesin basis data. Namun bahkan dalam kasus yang paling sederhana pun, segala sesuatunya ternyata lebih rumit dari yang kita kira. Di bawah ini kami menggunakan contoh tipikal untuk mengilustrasikannya. Misalkan Anda menjalankan situs blog yang Anda perbarui hampir setiap hari, dan situs tersebut mengizinkan pengunjung untuk mengomentari postingan Anda.
Dalam hal ini, skema database kita harus menyertakan setidaknya dua tabel MyISAM, satu untuk menyimpan postingan blog Anda dan satu lagi untuk menangani komentar pengunjung. Jelasnya, terdapat hubungan satu-ke-banyak antara kedua tabel ini, jadi kita perlu mendefinisikan kunci asing pada tabel kedua agar integritas database dapat dipertahankan ketika baris data diperbarui atau dihapus.
Untuk aplikasi seperti di atas, menjaga integritas kedua tabel tidak hanya merupakan tantangan serius, namun kesulitan terbesarnya adalah kita harus menjaga integritasnya di tingkat aplikasi. Ini adalah pendekatan yang diambil selama pengembangan untuk sebagian besar proyek web yang tidak memerlukan penggunaan transaksi karena tabel MyISAM memberikan kinerja yang sangat baik.
Tentu saja, hal ini juga memerlukan biaya. Seperti yang saya katakan sebelumnya, aplikasi harus menjaga integritas dan konsistensi database, yang berarti menerapkan logika pemrograman yang lebih kompleks untuk menangani hubungan antara berbagai tabel. Meskipun akses database dapat disederhanakan melalui penggunaan lapisan abstraksi dan modul ORM, seiring dengan bertambahnya jumlah tabel data yang dibutuhkan oleh suatu aplikasi, logika yang diperlukan untuk menanganinya pasti akan menjadi lebih kompleks.
Jadi, untuk MySQL, apakah ada metode pemrosesan kunci asing tingkat basis data untuk membantu menjaga integritas basis data? Untungnya, jawabannya adalah ya! MySQL juga dapat mendukung tabel InnoDB, memungkinkan kita menggunakan cara yang sangat sederhana untuk menangani kendala kunci asing. Fitur ini memungkinkan kita memicu tindakan tertentu, seperti memperbarui dan menghapus baris data tertentu dalam tabel untuk mempertahankan hubungan yang telah ditentukan sebelumnya.
Semuanya memiliki pro dan kontra, dan kelemahan utama menggunakan tabel InnoDB adalah tabel tersebut lebih lambat dibandingkan MyISAM, terutama dalam aplikasi skala besar di mana banyak tabel harus di-query. Untungnya, tabel MyISAM di versi MySQL yang lebih baru juga mendukung batasan kunci asing.
Artikel ini akan memperkenalkan cara menerapkan batasan kunci asing pada tabel InnoDB. Selain itu, kami akan menggunakan kelas abstrak MySQL sederhana berbasis PHP untuk membuat kode sampel yang relevan; tentu saja, Anda juga dapat menggunakan bahasa sisi server favorit Anda lainnya. Sekarang, kami mulai memperkenalkan cara menerapkan batasan kunci asing pada MySQL.
Kapan menggunakan batasan kunci asing
Sejujurnya, saat menggunakan tabel InnoDB di MySQL, Anda tidak harus menggunakan batasan kunci asing. Namun, untuk tujuan batasan kunci asing dalam situasi tertentu, kami akan menggunakan kode dari contoh yang disebutkan sebelumnya untuk menjelaskan secara detail. Ini mencakup dua tabel MyISAM, digunakan untuk menyimpan posting blog dan komentar.
Saat mendefinisikan skema database, kita perlu membuat hubungan satu-ke-banyak antara dua tabel dengan membuat kunci asing di tabel tempat komentar disimpan untuk memetakan baris data (yaitu komentar) ke artikel blog tertentu. Berikut adalah kode SQL dasar untuk membuat contoh tabel MyISAM:
DROP TABLE JIKA ADA `test`.`blogs`;
BUAT TABEL `test`.`blogs` (
`id` INT(10) AUTO_INCREMENT TIDAK DITANDATANGANI,
TEKS `judul`,
TEKS `konten`,
`penulis` VARCHAR(45) DEFAULT NULL,
KUNCI PRIROSE (`id`)
) MESIN=HARSET DEFAULT MyISAM=utf8;
DROP TABLE JIKA ADA `test`.`comments`;
BUAT TABEL `tes`.`komentar` (
`id` INT(10) AUTO_INCREMENT TIDAK DITANDATANGANI,
`blog_id` INT(10) NULL DEFAULT TIDAK DITANDATANGANI,
TEKS `komentar`,
`penulis` VARCHAR(45) DEFAULT NULL,
KUNCI PRIROSE (`id`)
) MESIN=HARSET DEFAULT MyISAM=utf8;
Di atas, kita baru saja mendefinisikan dua tabel MyISAM, yang membentuk lapisan data aplikasi blog. Seperti yang Anda lihat, tabel pertama disebut blog. Ini terdiri dari beberapa bidang yang jelas, yang digunakan untuk menyimpan ID, judul dan konten setiap posting blog, dan terakhir penulis. Tabel kedua diberi nama komentar, yang digunakan untuk menyimpan komentar yang terkait dengan setiap postingan blog. Tabel ini menggunakan ID postingan blog sebagai kunci asingnya untuk membangun hubungan satu-ke-banyak.
Sejauh ini, pekerjaan kita mudah karena kita hanya membuat dua tabel MyISAM sederhana. Selanjutnya, apa yang ingin kita lakukan adalah mengisi tabel-tabel ini dengan beberapa catatan untuk menunjukkan lebih lanjut apa yang harus dilakukan di tabel lain ketika sebuah entri dihapus di tabel pertama.
Perbarui dan pertahankan integritas basis data
Pada bagian sebelumnya, kita membuat dua tabel MyISAM untuk dijadikan sebagai lapisan data aplikasi blog. Tentu saja pengenalan di atas masih sangat sederhana dan perlu kita bahas lebih lanjut. Untuk melakukannya, kami akan mengisi tabel ini dengan beberapa catatan dengan menggunakan perintah SQL sebagai berikut:
INSERT INTO blog (id, title, content, author) VALUES (NULL,'Judul entri blog pertama', 'Isi entri blog pertama', 'Ian')
INSERT INTO comments (id, blog_id, comment, author) VALUES (NULL, 1, 'Mengomentari entri blog pertama', 'Susan Norton'), (NULL, 1, 'Mengomentari entri blog pertama', 'Rose Wilson')
Kode di atas sebenarnya mensimulasikan situasi dimana pembaca Susan dan Rose berkomentar di blog pertama kita. Misalkan sekarang kita ingin mengupdate blog pertama dengan postingan lain. Tentu saja, situasi ini mungkin terjadi.
Dalam hal ini, untuk menjaga konsistensi database, tabel komentar juga harus diperbarui, baik secara manual atau oleh aplikasi yang memproses lapisan data. Untuk contoh ini, kami akan menggunakan perintah SQL untuk menyelesaikan pembaruan sebagai berikut:
UPDATE blog SET id = 2, title = 'Judul entri blog pertama', content = 'Isi entri blog pertama', author = 'John Doe' WHERE id = 1
UPDATE komentar SET blog_id = 2 WHERE blod_id = 1
Seperti disebutkan sebelumnya, karena konten item data blog pertama telah diperbarui, tabel komentar juga harus mencerminkan perubahan ini. Tentu saja, pada kenyataannya, operasi pembaruan ini harus diselesaikan pada lapisan aplikasi, bukan secara manual, yang berarti logika ini harus diimplementasikan menggunakan bahasa sisi server.
Untuk menyelesaikan operasi ini, PHP dapat menggunakan sub-proses sederhana, namun kenyataannya, jika batasan kunci asing digunakan, operasi pembaruan tabel komentar dapat didelegasikan ke database.
Seperti disebutkan sebelumnya dalam artikel, tabel InnoDB MySQL menyediakan dukungan tanpa batas untuk fungsi ini. Oleh karena itu, di bagian selanjutnya kita akan menggunakan batasan kunci asing untuk membuat ulang kode contoh sebelumnya.
Mengalirkan pembaruan ke database
Di bawah ini, kita akan menyusun ulang kode contoh sebelumnya menggunakan batasan kunci asing dan tabel InnoDB (bukan tipe MyISAM default). Untuk melakukannya, pertama-tama definisikan ulang dua tabel sampel sehingga keduanya bisa menggunakan mesin database tertentu. Untuk melakukannya, Anda dapat menggunakan kode SQL seperti berikut:
DROP TABLE JIKA ADA `test`.`blogs`;
BUAT TABEL `test`.`blogs` (
`id` INT(10) AUTO_INCREMENT TIDAK DITANDATANGANI,
TEKS `judul`,
TEKS `konten`,
`penulis` VARCHAR(45) DEFAULT NULL,
KUNCI PRIROSE (`id`)
) MESIN=CHARSET DEFAULT InnoDB=utf8;
DROP TABLE JIKA ADA `test`.`comments`;
BUAT TABEL `tes`.`komentar` (
`id` INT(10) AUTO_INCREMENT TIDAK DITANDATANGANI,
`blog_id` INT(10) NULL DEFAULT TIDAK DITANDATANGANI,
TEKS `komentar`,
`penulis` VARCHAR(45) DEFAULT NULL,
KUNCI PRIROSE (`id`),
KUNCI `blog_ind` (`blog_id`),
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENSI `blogs` (`id`) PADA UPDATE CASCADE
) MESIN=CHARSET DEFAULT InnoDB=utf8;
Perbedaan yang jelas antara kode di sini dan kode sebelumnya adalah kedua tabel sekarang menggunakan mesin penyimpanan InnoDB, sehingga dapat mendukung batasan kunci asing. Selain itu, kita juga perlu memperhatikan kode yang mendefinisikan tabel komentar:
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENSI `blogs` (`id`) PADA UPDATE CASCADE
Faktanya, pernyataan ini memberi tahu MySQL bahwa ketika tabel blogs diperbarui, nilai kunci asing blog_id di tabel komentar juga harus diperbarui. Dengan kata lain, yang dilakukan di sini adalah membiarkan MySQL menjaga integritas database secara cascading Artinya, ketika sebuah blog diperbarui, komentar yang terhubung dengannya juga harus segera mencerminkan perubahan ini . Itu tidak dilakukan pada lapisan aplikasi.
Dua contoh tabel MySQL telah ditentukan. Sekarang, memperbarui kedua tabel ini semudah menjalankan pernyataan UPDATE, seperti yang ditunjukkan di bawah ini:
"UPDATE blog SET id = 2, title = 'Judul entri blog pertama', content = 'Isi entri blog pertama', author = 'John Doe' WHERE id = 1"
Seperti disebutkan sebelumnya, kita tidak perlu memperbarui tabel komentar karena MySQL akan menangani ini secara otomatis. Selain itu, Anda dapat membuat MySQL tidak melakukan apa pun saat mencoba memperbarui baris di tabel blog dengan menghapus bagian "ON UPDATE" dari kueri atau menentukan "NO ACTION" dan "RESTRICT". Tentu saja, Anda juga bisa membiarkan MySQL melakukan hal lain, yang akan diperkenalkan di artikel berikutnya.
Melalui pendahuluan di atas, saya rasa semua orang memiliki pemahaman yang jelas tentang cara menggunakan batasan kunci asing dalam hubungannya dengan tabel InnoDB di MySQL. Tentu saja, Anda juga dapat menulis kode langsung lebih lanjut untuk lebih memperdalam pemahaman Anda tentang fungsi database yang mudah digunakan ini.