Tutorial ini memberikan langkah-langkah lengkap untuk merancang skema database polling dan survei tertutup atau terbuka melalui kuesioner untuk mengelola pengguna, polling, pertanyaan, jawaban, dan suara. Ini dapat digunakan lebih lanjut untuk mengembangkan situs web polling dan survei atau aplikasi seluler.
Diagram Hubungan Entitas atau desain basis data visual ditunjukkan di bawah ini.
Gambar 1
Catatan :Untuk menjaga agar skema basis data tetap sederhana dan untuk mengembangkan produk minimal yang layak, skema ini tidak mencakup opsi lanjutan seperti pembuatan versi dan peninjauan jajak pendapat dan survei. Ini membatasi hanya pengguna yang masuk untuk mengambil bagian dalam survei atau jajak pendapat untuk menghindari spam sehingga hanya suara sah yang dikirimkan.
Anda juga dapat mengunjungi tutorial populer termasuk Cara Menginstal MySQL 8 di Ubuntu, Cara Menginstal MySQL 8 di Windows, Database RBAC di MySql, Database Blog di MySql, Mempelajari Kueri SQL Dasar Di MySQL.
Basis Data Jajak Pendapat
Langkah pertama adalah membuat Poll Database. Itu dapat dibuat menggunakan kueri seperti yang ditunjukkan di bawah ini.
CREATE SCHEMA `poll` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Saya telah menggunakan set karakter utf8mb4 untuk mendukung berbagai karakter.
Tabel Pengguna
Di bagian ini, kita akan mendesain Tabel Pengguna untuk menyimpan informasi pengguna pemilik polling/survey. Tabel yang sama dapat digunakan untuk menghubungkan pemilik jajak pendapat/survei sehingga pengguna dapat mengelola jajak pendapat atau survei mereka sendiri dan untuk melacak aktivitas pemungutan suara. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Pengguna.
Id | Id unik untuk mengidentifikasi pengguna. |
Nama Depan | Nama depan pengguna. |
Nama Tengah | Nama tengah pengguna. |
Nama Belakang | Nama belakang pengguna. |
Seluler | Nomor ponsel pengguna. Ini dapat digunakan untuk tujuan login dan registrasi. |
Email pengguna. Ini dapat digunakan untuk tujuan login dan registrasi. | |
Hash Kata Sandi | Hash kata sandi yang dihasilkan oleh algoritme yang sesuai. Kita harus menghindari penyimpanan sandi biasa. |
Tuan Rumah | Bendera untuk mengidentifikasi apakah pengguna dapat menyelenggarakan polling atau survei. |
Terdaftar Di | Kolom ini dapat digunakan untuk menghitung umur pengguna dengan aplikasi tersebut. |
Login Terakhir | Ini dapat digunakan untuk mengidentifikasi login terakhir pengguna. |
Pengantar | Pengenalan singkat tentang Pengguna yang akan ditampilkan di Halaman Jajak Pendapat atau Survei. |
Profil | Detail pemilik yang akan ditampilkan di Halaman Jajak Pendapat atau Survei. |
Tabel Pengguna dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `poll`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`host` TINYINT(1) NOT NULL DEFAULT 0,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );
Tabel Jajak Pendapat
Di bagian ini, kita akan mendesain Tabel Jajak Pendapat untuk menyimpan data polling dan survei. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Poll.
Id | Id unik untuk mengidentifikasi jajak pendapat/survei. |
Id Host | ID host untuk mengidentifikasi host polling/survei. |
Judul | Judul jajak pendapat/survei yang akan ditampilkan di Halaman Jajak Pendapat/Survei dan daftarnya. |
Judul Meta | Judul meta yang akan digunakan untuk judul browser dan SEO. |
Siput | Siput untuk membentuk URL. |
Ringkasan | Ringkasan untuk menyebutkan sorotan utama. |
Ketik | Jenis yang membedakan antara polling dan survei. |
Diterbitkan | Ini dapat digunakan untuk mengidentifikasi apakah jajak pendapat/survei tersedia untuk umum. |
Dibuat Pada | Ini menyimpan tanggal dan waktu pembuatan jajak pendapat/survei. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu pembaruan jajak pendapat/survei. |
Diterbitkan Pada | Ini menyimpan tanggal dan waktu saat jajak pendapat/survei diterbitkan. |
Mulai Dari | Ini menyimpan tanggal dan waktu saat jajak pendapat/survei dimulai dan dibuka untuk pemungutan suara. |
Berakhir Pada | Ini menyimpan tanggal dan waktu penutupan jajak pendapat/survei untuk pemungutan suara. |
Konten | Kolom yang digunakan untuk menyimpan data polling/survey. |
Tabel Polling dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `poll`.`poll` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`hostId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`startsAt` DATETIME NULL DEFAULT NULL,
`endsAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_poll_host` (`hostId` ASC),
CONSTRAINT `fk_poll_host`
FOREIGN KEY (`hostId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Meta Polling
Tabel Meta Jajak Pendapat dapat digunakan untuk menyimpan informasi tambahan dari suatu jajak pendapat atau survei termasuk URL spanduk jajak pendapat, dll. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Meta Jajak Pendapat.
Id | Id unik untuk mengidentifikasi meta polling. |
Id Polling | Id polling untuk mengidentifikasi polling/survei induk. |
Kunci | Kunci yang mengidentifikasi meta. |
Konten | Kolom yang digunakan untuk menyimpan metadata polling. |
Tabel Meta Polling dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `poll`.`poll_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_poll` (`pollId` ASC),
UNIQUE INDEX `uq_poll_meta` (`pollId` ASC, `key` ASC),
CONSTRAINT `fk_meta_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabel Pertanyaan Jajak Pendapat
Tabel Pertanyaan Poll dapat digunakan untuk menyimpan pertanyaan-pertanyaan yang berhubungan dengan polling dan survey. Skenario yang ideal adalah memiliki satu pertanyaan untuk polling dan beberapa pertanyaan untuk survei. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Pertanyaan Jajak Pendapat.
Id | Id unik untuk mengidentifikasi pertanyaan polling. |
Id Polling | Id polling untuk mengidentifikasi polling/survei induk. |
Ketik | Jenis pertanyaan. Jenisnya bisa berupa pilihan tunggal (Ya/Tidak), pilihan ganda, pilih, atau masukan. |
Aktif | Tandai untuk mengidentifikasi apakah pertanyaan aktif. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat pertanyaan dibuat. |
Diperbarui Pada | Menyimpan tanggal dan waktu pembaruan pertanyaan. |
Konten | Kolom yang digunakan untuk menyimpan pertanyaan. |
Tabel Pertanyaan Poll dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `poll`.`poll_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`type` VARCHAR(50) NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_question_poll` (`pollId` ASC),
CONSTRAINT `fk_question_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabel Jawaban Jajak Pendapat
Tabel Jawaban Poll dapat digunakan untuk menyimpan jawaban dari pertanyaan pilihan tunggal, pilihan ganda dan pilihan jenis. Untuk pertanyaan pilihan tunggal, jawabannya bisa Ya dan Tidak. Di bawah ini adalah deskripsi dari semua kolom Tabel Jawaban Jajak Pendapat.
Id | Id unik untuk mengidentifikasi jawaban polling. |
Id Polling | Id polling untuk mengidentifikasi polling/survei induk. |
Id Pertanyaan | Id pertanyaan untuk mengidentifikasi pertanyaan induk. |
Aktif | Tandai untuk mengidentifikasi apakah jawaban aktif. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat jawaban dibuat. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu saat jawaban diperbarui. |
Konten | Kolom yang digunakan untuk menyimpan jawaban. |
Tabel Jawaban Polling dengan batasan yang sesuai adalah seperti di bawah ini.
CREATE TABLE `poll`.`poll_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_answer_poll` (`pollId` ASC),
CONSTRAINT `fk_answer_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `poll`.`poll_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabel Pemungutan Suara
Tabel Poll Vote dapat digunakan untuk menyimpan pilihan dan input pengguna. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Suara Jajak Pendapat.
Id | Id unik untuk mengidentifikasi suara polling. |
Id Polling | Id polling untuk mengidentifikasi polling/survei. |
Id Pertanyaan | Id pertanyaan untuk mengidentifikasi pertanyaan. |
Id Jawaban | Id jawaban untuk mengidentifikasi jawaban. |
Id Pengguna | ID pengguna untuk mengidentifikasi pengguna. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat jawaban dibuat. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu saat jawaban diperbarui. |
Konten | Kolom yang digunakan untuk menyimpan input pengguna. |
Tabel Poll Vote dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `poll`.`poll_vote` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` BIGINT DEFAULT NULL,
`userId` BIGINT NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_vote_poll` (`pollId` ASC),
CONSTRAINT `fk_vote_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_answer` (`answerId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_answer`
FOREIGN KEY (`answerId`)
REFERENCES `poll`.`poll_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_user` (`userId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_user`
FOREIGN KEY (`userId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabel Kategori dan Tabel Kategori Jajak Pendapat
Di bagian ini, kita akan mendesain Tabel Kategori dan Tabel Kategori Jajak Pendapat untuk menyimpan kategori polling dan pemetaannya. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Kategori.
Id | Id unik untuk mengidentifikasi kategori. |
Id Induk | Id induk untuk mengidentifikasi kategori induk. |
Judul | Judul kategori. |
Judul Meta | Judul meta yang akan digunakan untuk judul browser dan SEO. |
Siput | Slug kategori untuk membentuk URL. |
Konten | Kolom yang digunakan untuk menyimpan data kategori. |
Tabel Kategori dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `poll`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));
ALTER TABLE `poll`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `poll`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Kategori Poll.
Id Polling | Id polling untuk mengidentifikasi polling atau survei. |
Id Kategori | Id kategori untuk mengidentifikasi kategori. |
Tabel Kategori Polling dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `poll`.`poll_category` (
`pollId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`pollId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_poll` (`pollId` ASC),
CONSTRAINT `fk_pc_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Tabel Tag dan Tabel Tag Jajak Pendapat
Mirip dengan tabel kategori kategori dan polling, kita dapat mendesain Tabel Tag dan Tabel Tag Jajak Pendapat . Perbedaan utama antara Kategori dan Tag tercantum di bawah ini.
- Kolom parentId tidak diperlukan di Tabel Tag.
- Jumlah kategori tetap rendah karena ini dapat digunakan untuk membentuk Menu Utama untuk tujuan navigasi. Tag bisa lebih banyak dibandingkan dengan kategori.
- Kategori dan tag dapat digunakan untuk menghubungkan polling.
- Seseorang harus menetapkan hanya beberapa kategori ke jajak pendapat sedangkan jumlah tag bisa lebih banyak.
Ringkasan
Demikian kami dapat merancang Database Poll untuk digunakan sebagai pembentukan website dan aplikasi mobile berbasis Poll and Survey. Hal yang sama dapat lebih ditingkatkan untuk menambahkan lebih banyak opsi lanjutan termasuk video, pembayaran, langganan, dll.
Anda dapat mengirimkan komentar Anda untuk bergabung dalam diskusi. Anda mungkin juga tertarik untuk mendesain database aplikasi Blog. Desain RBAC dapat digunakan untuk implementasi Kontrol Akses Berbasis Peran.
Skema database lengkap juga tersedia di GitHub.