top of page

Pembuatan WhatsApp Database Menggunakan MySQL

Writer's picture: Adib Ahmad IstiqlalAdib Ahmad Istiqlal

Updated: Sep 19, 2022

Projek ini bertujuan untuk menggambarkan bagaimana salah satu aplikasi chatting terbesar, yaitu WhatsApp bekerja. Pada projek ini fungsi-fungsi yang dibutuhkan antara lain yaitu.

  1. DDL (Create, Drop)

  2. DML (Insert, Update, Delete)

  3. DCL (SELECT)

  4. Procedurs

  5. Triggers

  6. JOIN

Pembuatan database ini memperlihatkan ketika pengguna ingin registrasi dan menambahkan atau mengganti (nama atau nomor yang digunakan atau yang disimpannya).



Tahap pertama yang dilakukan adalah pembuatan database dengan nama wa_version

CREATE DATABASE wa_version

Setelah membuat database, maka membuat tabel yang diperlukan. Disini pembuatan tabel pengguna dan tabel kontak


  1. Tabel Pengguna

Tabel pengguna terdiri dari

  • Id bertipe Integer PRIMARY KEY

  • nama bertipe Varchar

  • foto bertipe Longblob

  • nomor bertipe Varchar UNIQUE KEY

CREATE TABLE `wa_version_02`.`pengguna` ( `id` INT(10) NOT NULL AUTO_INCREMENT , `nama` VARCHAR(50) NOT NULL , `foto` LONGBLOB NOT NULL , `nomor` VARCHAR(12) NOT NULL , PRIMARY KEY (`id`), UNIQUE (`nomor`)) ENGINE = InnoDB;

2. Tabel Kontak

Tabel Kontak terdiri dari

  • id INT PRIMARY KEY

  • nomor bertipe VARCHAR

  • nama_kontak VARHCAR

  • nomor_kontak VARCHAR FOREIGN KEY

CREATE TABLE `wa_version_02`.`kontak` ( `id` INT(10) NOT NULL AUTO_INCREMENT , `nomor` VARCHAR(12) NOT NULL , `nama_kontak` VARCHAR(50) NULL , `nomor_kontak` VARCHAR(12) NULL , PRIMARY KEY (`id`), INDEX (`nomor`), INDEX (`nomor_kontak`)) ENGINE = InnoDB;

Setelah itu akan diinputkan data contoh 5 pengguna ke dalam tabel pengguna

INSERT INTO `pengguna` (`id`, `nama`, `nomor`) VALUES (NULL, 'Adib', '085646317415'), (NULL, 'Amel', '082139087703'), (NULL, 'Farhan', '081246082297'), (NULL, 'Jevin', '082244929875'), (NULL, 'Milos', '082112211122')

Note: Foto disitu tidak ada karena kolom itu bersifat Longblob dimana jika dimasukkan menghasil teks yang sangat panjang.



Registrasi

Setelah itu mari buat Stored Procedurs Registrasi. Tujuannya dibuat Procedurs ini untuk memudahkan pengguna untuk registrasi tanpa harus menulis querynya. Andaikan pada saat registrasi di WhatsApp sebenarnya pengguna hanya memasukkan nomor, nama dan foto. Sebearnya untuk memudahkan lagi harus bekerja sama dengan Software Engineering, namun karena ini ilustrasi database, maka harus memasukkan satu-satu.

DELIMITER //
CREATE PROCEDURE `Registrasi`(
	IN `id` INT(12), 
	IN `nama` VARCHAR(50), 
	IN `foto` LONGBLOB, 
	IN `nomor` VARCHAR(12)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
BEGIN
DECLARE str VARCHAR(50);
IF (SELECT DISTINCT(nomor) FROM pengguna WHERE pengguna.nomor != nomor) THEN
	INSERT INTO pengguna VALUES('', nama, foto, nomor);
 END IF;
 END //

Jadi pada Procedure di atas bernama Registrasi yang mana variabelnya sama yang ada pada tabel pengguna. Setelah itu ditambahkan BEGIN dan lakukan suatu INSERT dimana dilihat terlebih dahulu nomor yang ada di tabel tersebut dengan bantuan distinct untuk menjatah setiap nomor hanya satu. Jika tidak ada, maka masukkan data tersebut kedalam tabel pengguna, namun jika ada berikan pesan 'Duplicate Entry'.

Setelah proses pembuatan selesai, selanjutnya akan ditesting. Untuk mentestingnya gunakan fungsi CALL

Fungsi di atas menyatakan bahwa nama 'Uvu' ingin daftar WhatsApp dengan nomor tersebut.

Tabel Pengguna

Namun bagaimana jika Uvu ingin medaftar dengan nomor yang sama? Maka tabel akan menampilkan persan seperti berikut.

Hal tersebut dikarenakan bahwasanya nomor bersifat Unique Key. Namun pada WhatsApp ketika pengguna melakukan registrasi, dia tidak memiliki kontak namun dapat menambahkan kontak. Sehingga, pada saat pengguna melakukan registrasi nomor, pengguna juga otomatis masuk kedalam tabel kontak. Maka pada procedurs, tinggal menambahkan query INSERT pada table kontak.

DELIMITER //
CREATE PROCEDURE `Registrasi`(
	IN `id` INT(12), 
	IN `nama` VARCHAR(50), 
	IN `foto` LONGBLOB, 
	IN `nomor` VARCHAR(12)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
BEGIN
DECLARE str VARCHAR(50);
IF (SELECT DISTINCT(nomor) FROM pengguna WHERE pengguna.nomor != nomor) THEN
	INSERT INTO pengguna VALUES('', nama, foto, nomor);
	INSERT INTO kontak VALUES('', nomor, NULL, NULL);
 END IF;
 END //

Tambah Kontak

Setelah melakukan registrasi, maka selanjutnya akan membuat PROCEDUR untuk tambah kontak. Alur untuk tambah kontak sendiri seperti berikut.

  1. Jika nomor sudah registrasi dan nama_kontak dan nomor_kontak adalah NULL. Maka UPDATE nama_kontak dengan nomor_kontak dengan yang dimasukkan pengguna saat menambahkan dengan nomor yang sama.

  2. Namun, jika nomor_kontak itu pada nomor pengguna sudah terdapat pada tabel. Maka munculkan tabel tersebut (SELECT).

  3. Jika kondisi kedua diatas, tidak terpenuhi. Maka masukkan data baru (INSERT)

DELIMITER //
CREATE PROCEDURE `tambahkontak`(IN `id` INT(10), IN `nomor` VARCHAR(12), IN `nama_kontak` VARCHAR(50), IN `nomor_kontak` VARCHAR(12)) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER BEGIN
IF(SELECT nomor_kontak FROM kontak WHERE kontak.nama_kontak IS NULL AND 	kontak.nomor_kontak IS NULL AND kontak.nomor = nomor) THEN
	UPDATE kontak
    SET
    kontak.nama_kontak = nama_kontak,
    kontak.nomor_kontak = nomor_kontak
    WHERE kontak.nomor = nomor AND kontak.nomor_kontak IS NULL AND
    kontak.nomor_kontak IS NULL;

ELSEIF (SELECT nomor kontak WHERE kontak.nomor = nomor AND
        kontak.nomor_kontak IN (SELECT nomor_kontak FROM kontak
        WHERE kontak.nomor_kontak = nomor_kontak) GROUP BY nomor) THEN
        SELECT * FROM kontak;

ELSE
	INSERT INTO kontak VALUES ('',nomor,nama_kontak,nomor_kontak);
 END IF;
 END //

Misal 'Uvu' ingin menambahkan Adib pada kontaknya. Maka yang terjadi adalah syarat pertama (UPDATE).

Namun, bagaimana jika dia menambahkan Adib dengan nomor_kontak yang sama? Maka yang terjadi adalah syarat yang kedua (SELECT).

Selanjutnya, jika Uvu ingin menbamhkan kontak baru atas nama Amel? Maka yang terjadi adalah syarat ketiga (INSERT).


Edit Kontak

Proses selanjutnya adalah pembuatan PROCEDUR edit kontak. Procedur ini berfungsi jika nomor_kontak sudah dimiliki oleh nomor pengguna. Pada WhatsApp, ketika pengguna dapat mengubah nomor pada kontaknya jikalau nomor_kontak pada kontaknya berubah.

CREATE DEFINER=`root`@`localhost` PROCEDURE `editkontak`(
IN `nomor` VARCHAR(12), 
IN `nama_kontak` VARCHAR(50), 
IN `nomor_kontak` VARCHAR(12)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
BEGIN
UPDATE kontak
    SET
   		kontak.nomor = nomor,
        kontak.nama_kontak = nama_kontak,
        kontak.nomor_kontak = nomor_kontak
WHERE kontak.nomor = nomor AND kontak.nama_kontak = nama_kontak;
END

Katakan saja Amel merubah nomornya menjadi 082139087750. Pada WhatsApp, ketika pengguna (Uvu) memiliki nomor kontak sebelum diubah oleh pengguna (Amel) nomor tersebut, WhatsApp akan memberikan pesan 'Akun ini telah merubah kontaknya' dan WhatsApp tidak otomatis mengganti nomor_kontak baru (Amel) pada akun tersebut di miliki kita. Sehingga disini saya menambahkan Trigger ubah nomor.

CREATE TRIGGER `ubahnomor` AFTER UPDATE ON `pengguna` FOR EACH ROW UPDATE kontak
	SET 
    nomor = NEW.nomor
    WHERE kontak.nomor NOT IN (SELECT pengguna.nomor FROM pengguna)

Pada Trigger sendiri terdapat 4 acuan, yaitu

  1. Trigger Name: Nama dari trigger tersebut

  2. Table: Sumber pengubah tabel tersebut. Contoh jika diset di tabel pengguna. Maka jika data pengguna dirubah, tabel pengguna ini akan merubah data di tabel lain (seperti query diatas, di set pada tabel kontak).

  3. TIME: time sendiri terdiri dari 2 pilihan. AFTER atau BEFORE. AFTER sendiri dijalankan setelah record dirubah pada database dan BEFORE dijalankan sebelum dirubah di database. Biasanya BEFORE digunakan untuk Validasi data.

  4. EVENT: Event terdiri dari 3 pilihan, INSERT, UPDATE, DELETE.


Misal, Amel menambahkan kontak Uvu dalam daftar kontaknya. Maka gunakan PROCEDUR tambah kontak.


Selanjutnya, andai kata Amel merubah nomornya menjadi 082139087750. Maka Trigger ubahnomor akan aktif. Pengaktifan trigger terjadi jika menggunakan query UPDATE pada umumnya pada tabel yang telah diset sumber update-annya menuju UPDATE pada tabel baru yang di set di quernya.

UPDATE pengguna 
SET
	nomor = '082139087750'
WHERE nomor = '082139087703'

Tabel Pengguna

Tabel Kontak

Dapat dilihat pada tabel nomor Amel yang sebelumnya 082139087703 berubah menjadi 082139087750. Namun, seperti yang telah dijelaskan sebelumnya, tabel nomor_kontak tidak berubah pada kontak Uvu (082121212111).


Jika Uvu ingin merubah nomor Amel pada daftar kontaknya, PROCEDUR editkontak yang digunakan.

Pada id 2 yang menyimpan dapat dilihat nomor_kontak pada Uvu berubah menjadi nomor yang diinputkan.


Selanjutnya, siapa saja yang daftar kontak yang disimpan Uvu dengan syarat tabel nama dan nama kontak. Permasalahan tersebut dapat diselesaikan dengan fungsi JOIN yang lebih spesifik yaitu INNER JOIN. Hal ini dikarenakan, permasalahan yang diberikan hanya ingin mendapati nama kontak yang terdaftar.

SELECT p.nama, k.nama_kontak FROM kontak k INNER JOIN pengguna p ON k.nomor = p.nomor WHERE p.nama = 'Uvu' AND p.nomor = '082121212111'

Pada query di atas, menyatakan bahwasa akan menampilkan kolom nama dari tabel pengguna dan nama dari tabel kontak. Setelah itu di INNER JOIN antar tabel dengan kuncinya memiliki nama dan tipe data yang sama pada kolom tiap tabel. Ditutup dengan syarat nama dari tabel pengguna adalah 'Uvu' DAN nomor dari tabel pengguna adalah '082121212111'



Selanjutnya, andai saja saya adalah pemegang database dan ingin mengetahui siapa saja yang Uvu tidak simpan dari pengguna yang terdaftar. Disini saya tidak melihat totalnya, karena jika menghitung total akan menggunakan COUNT. Saya hanya ingin melihat nama_kontak yang tidak disimpan. Untuk menyelesaikan permasalahan tersebut saya menyelesaikan menggunakan LEFT JOIN. Dimana tabel yang dikiri adalah tabel kontak dikarenakan saya ingin mencari relasi yang sama dari tabel kontak ke tabel pengguna.

SELECT p.nama, k.nama_kontak FROM pengguna p LEFT OUTER JOIN kontak k  ON p.nomor = k.nomor

Ternyata Uvu tidak menyimpan Adib, Farhan, Jevin dan Milos.

12 views0 comments

Recent Posts

See All

Comments


bottom of page