Tutorial ini memberikan langkah-langkah lengkap untuk merancang skema database sistem pemesanan restoran untuk mengelola pengguna, pemesanan meja, menu, inventaris, pesanan, dan pembayaran. Ini menyediakan desain database pesanan makanan untuk mengelola pesanan makanan untuk restoran. Ini dapat digunakan lebih lanjut untuk mengembangkan aplikasi sistem pemesanan restoran lokal.
Sistem pemesanan tersebut diterapkan untuk mengotomatiskan pemrosesan pesanan dan secara efisien menangani waktu pemesanan puncak, sehingga meningkatkan kepuasan pelanggan dengan sedikit usaha – situasi yang saling menguntungkan untuk bisnis restoran.
Diagram Hubungan Entitas atau desain basis data visual ditunjukkan di bawah ini.
Sistem Pemesanan Restoran
Catatan :Dapat digunakan untuk pemesanan meja secara online dan pre-order sebelum mencapai restoran. Keamanan juga dapat ditangani dengan mengikuti Database RBAC di MySQL.
Anda juga dapat mengunjungi tutorial populer termasuk Cara Menginstal MySQL 8 di Ubuntu, Cara Menginstal MySQL 8 di Windows, Cara Menginstal MySQL 8 Dengan Workbench Di Windows 10, Database RBAC di MySql, Database Blog di MySql, Database Kuis Di MySQL, Basis Data Poll &Survei Di MySQL, Basis Data Keranjang Belanja Online, dan Pelajari Kueri SQL Dasar Di MySQL.
Database Restoran
Langkah pertama adalah membuat Database Restoran. Itu dapat dibuat menggunakan kueri seperti yang ditunjukkan di bawah ini.
CREATE SCHEMA `restaurant` 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. Tabel yang sama dapat digunakan untuk mengelola berbagai jenis pengguna termasuk admin, koki, agen, dan pelanggan. Ini dapat digunakan untuk menghubungkan pengguna dengan Menu, Item, Pemesanan Meja, dan Pesanan. Pengguna dapat melacak tabel dan pesanan mereka sendiri. 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 kata sandi biasa atau terenkripsi. |
Admin | Bendera untuk mengidentifikasi apakah pengguna adalah administrator. Tidak diperlukan jika tabel RBAC dibuat dengan mengikuti desain database RBAC. |
Penjual | Bendera untuk mengidentifikasi apakah pengguna dapat menerima pesanan inventaris. Tidak diperlukan jika tabel RBAC dibuat dengan mengikuti desain database RBAC. |
Koki | Bendera untuk mengidentifikasi apakah pengguna dapat memasak item. Tidak diperlukan jika tabel RBAC dibuat dengan mengikuti desain database RBAC. |
Agen | Bendera untuk mengidentifikasi apakah pengguna dapat meng-host tabel. Tidak diperlukan jika tabel RBAC dibuat dengan mengikuti desain database RBAC. |
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 Vendor yang akan ditampilkan di Halaman Produk. |
Profil | Detail vendor yang akan ditampilkan di Halaman Produk. |
Tabel Pengguna dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`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,
`admin` TINYINT(1) NOT NULL DEFAULT 0,
`vendor` TINYINT(1) NOT NULL DEFAULT 0,
`chef` TINYINT(1) NOT NULL DEFAULT 0,
`agent` 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 Bahan, Item, Resep, dan Menu
Di bagian ini, kita akan mendesain Tabel Bahan, Item, Resep, dan Menu untuk menyimpan data menu dan item.
Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Bahan . Tabel Bahan juga dipetakan untuk mengidentifikasi pemasok yang dapat memasok bahan untuk mengisi kembali persediaan. Dalam skenario yang lebih maju, mungkin ada tabel terpisah untuk menyimpan bahan dan hubungan pemasok untuk mendukung banyak pemasok untuk bahan yang sama.
Id | Id unik untuk mengidentifikasi bahan. |
Id Pengguna | ID pengguna untuk mengidentifikasi admin. |
Id Vendor | Id vendor untuk mengidentifikasi pemasok. |
Judul | Judul bahan yang akan ditampilkan pada Resep Barang. |
Siput | Siput unik yang akan digunakan sebagai GID Bahan. |
Ringkasan | Ringkasan untuk menyebutkan sorotan utama. |
Ketik | Jenis untuk membedakan berbagai jenis bahan. |
SKU | Unit Penyimpanan Stok untuk melacak inventaris bahan. |
Kuantitas | Jumlah bahan yang tersedia. |
Satuan | Satuan Ukuran yang ditetapkan untuk bahan. |
Dibuat Pada | Ini menyimpan tanggal dan waktu pembuatan bahan. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu pembaruan bahan. |
Konten | Kolom yang digunakan untuk menyimpan detail bahan tambahan. |
Ini menggunakan jumlah kolom dan unit untuk melacak stok yang tersedia di inventaris bahan. Tabel Bahan dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`ingredient` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`vendorId` BIGINT DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`sku` VARCHAR(100) NOT NULL,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_ingredient_user` (`userId` ASC),
CONSTRAINT `fk_ingredient_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION);
ALTER TABLE `restaurant`.`ingredient`
ADD INDEX `idx_ingredient_vendor` (`vendorId` ASC);
ALTER TABLE `restaurant`.`ingredient`
ADD CONSTRAINT `fk_ingredient_vendor`
FOREIGN KEY (`vendorId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Item . Tabel Item juga dipetakan untuk mengidentifikasi pemasok yang dapat memasok item non-masak untuk mengisi kembali inventaris. Dalam skenario yang lebih maju, mungkin ada tabel terpisah untuk menyimpan item dan hubungan pemasok untuk mendukung banyak pemasok untuk item yang sama.
Catatan :Kita juga dapat menggunakan meja yang sama untuk menyimpan bahan dan barang untuk mempermudah pemesanan restoran dan pemasok. Dalam kasus seperti itu, self-join diperlukan untuk mengidentifikasi bahan item. Juga, kolom memasak dan harga tidak berguna untuk baris bahan.
Id | Id unik untuk mengidentifikasi item. |
Id Pengguna | ID pengguna untuk mengidentifikasi admin. |
Id Vendor | Id vendor untuk mengidentifikasi pemasok. |
Judul | Judul item yang akan ditampilkan pada Menu. |
Siput | Siput unik yang akan digunakan sebagai GID item. |
Ringkasan | Ringkasan untuk menyebutkan sorotan utama. |
Ketik | Jenis untuk membedakan antara berbagai jenis item. |
Memasak | Bendera untuk mengidentifikasi apakah memasak diperlukan untuk item tersebut. |
SKU | Unit Penyimpanan Stok untuk melacak inventaris barang. Ini diperlukan hanya jika item tersebut tidak terkait dengan bahan. |
Harga | Harga jual satu unit atau satu porsi. |
Kuantitas | Jumlah barang yang tersedia. Ini diperlukan hanya jika item tersebut tidak terkait dengan bahan. |
Satuan | Satuan Ukuran yang ditetapkan untuk item. Ini diperlukan hanya jika item tersebut tidak terkait dengan bahan. |
Resep | Petunjuk yang diperlukan untuk memasak item. |
Petunjuk | Petunjuk yang diperlukan untuk menyajikan item. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat item dibuat. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu saat item diperbarui. |
Konten | Kolom yang digunakan untuk menyimpan detail tambahan dari item. |
Mirip dengan Tabel Bahan, ini menggunakan jumlah kolom dan unit untuk melacak stok yang tersedia di inventaris item. Tabel Item dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`vendorId` BIGINT DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`cooking` TINYINT(1) NOT NULL DEFAULT 0,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`recipe` TEXT NULL DEFAULT NULL,
`instructions` TEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_item_user` (`userId` ASC),
CONSTRAINT `fk_item_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION);
ALTER TABLE `restaurant`.`item`
ADD INDEX `idx_item_vendor` (`vendorId` ASC);
ALTER TABLE `restaurant`.`item`
ADD CONSTRAINT `fk_item_vendor`
FOREIGN KEY (`vendorId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabel Resep dapat digunakan untuk melacak jumlah bahan yang dibutuhkan untuk suatu item untuk satu porsi. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Resep.
Id | Id unik untuk mengidentifikasi resep. |
Id Item | Id item untuk mengidentifikasi item. |
Id Bahan | Id bahan untuk mengidentifikasi bahan. |
Kuantitas | Jumlah bahan yang dibutuhkan untuk memasak item untuk satu porsi. |
Satuan | Satuan Ukuran untuk mengidentifikasi jumlah bahan yang dibutuhkan untuk item tersebut. |
Petunjuk | Petunjuk bahan yang diperlukan untuk memasak item. |
Tabel Resep dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`recipe` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`itemId` BIGINT NOT NULL,
`ingredientId` BIGINT NOT NULL,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`instructions` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_recipe_item` (`itemId` ASC),
UNIQUE INDEX `uq_recipe_item_ingredient` (`itemId` ASC, `ingredientId` ASC),
CONSTRAINT `fk_recipe_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `restaurant`.`recipe`
ADD INDEX `idx_recipe_ingredient` (`ingredientId` ASC);
ALTER TABLE `restaurant`.`recipe`
ADD CONSTRAINT `fk_recipe_ingredient`
FOREIGN KEY (`ingredientId`)
REFERENCES `restaurant`.`ingredient` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION;
Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Menu . Tabel Menu dapat digunakan untuk menyimpan beberapa menu dari restoran yang sama.
Id | Id unik untuk mengidentifikasi menu. |
Id Pengguna | ID pengguna untuk mengidentifikasi admin. |
Judul | Judul menu yang akan ditampilkan pada Kartu Menu. |
Siput | Siput unik yang akan digunakan sebagai GID menu. |
Ringkasan | Ringkasan untuk menyebutkan sorotan utama dari kartu menu. |
Ketik | Jenis untuk membedakan antara berbagai jenis menu. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat item dibuat. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu saat item diperbarui. |
Konten | Kolom yang digunakan untuk menyimpan detail tambahan dari menu. |
Tabel Menu dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`menu` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_menu_user` (`userId` ASC),
CONSTRAINT `fk_menu_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION);
Tabel Item Menu dapat digunakan untuk melacak item yang tersedia di Kartu Menu. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Item Menu.
Id | Id unik untuk mengidentifikasi item menu. |
Id Menu | Id menu untuk mengidentifikasi menu. |
Id Item | Id item untuk mengidentifikasi item. |
Aktif | Bendera untuk memeriksa apakah barang tersedia. |
Tabel Item Menu dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`menu_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`menuId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
INDEX `idx_menu_item_menu` (`menuId` ASC),
UNIQUE INDEX `uq_menu_item` (`menuId` ASC, `itemId` ASC),
CONSTRAINT `fk_menu_item_menu`
FOREIGN KEY (`menuId`)
REFERENCES `restaurant`.`menu` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `restaurant`.`menu_item`
ADD INDEX `idx_menu_item_item` (`itemId` ASC);
ALTER TABLE `restaurant`.`menu_item`
ADD CONSTRAINT `fk_menu_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION;
Meja Koki Item dapat digunakan untuk mengidentifikasi Chef yang ditugaskan untuk memasak item. Disebutkan di bawah ini adalah deskripsi dari semua kolom Item Chef Table.
Id | Id unik untuk mengidentifikasi item menu. |
Id Item | Id item untuk mengidentifikasi item. |
Id Koki | Id koki untuk mengidentifikasi pengguna. |
Aktif | Bendera untuk memeriksa apakah koki tersedia untuk memasak item. |
Tabel Koki Item dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`item_chef` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`itemId` BIGINT NOT NULL,
`chefId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
INDEX `idx_item_chef_item` (`itemId` ASC),
UNIQUE INDEX `uq_item_chef` (`itemId` ASC, `chefId` ASC),
CONSTRAINT `fk_item_chef_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `restaurant`.`item_chef`
ADD INDEX `idx_item_chef_chef` (`chefId` ASC);
ALTER TABLE `restaurant`.`item_chef`
ADD CONSTRAINT `fk_item_chef_chef`
FOREIGN KEY (`chefId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION;
TableTop dan Tabel Pemesanan
Di bagian ini, kami akan mendesain TableTop dan Tabel Pemesanan untuk menyimpan meja restoran dan detail pemesanannya.
TableTop Table dapat digunakan untuk menyimpan detail meja di restoran. Status tabel bisa Free, Reserved, dan Active. Saya telah menggunakan TableTop alih-alih Tabel untuk membedakannya dari kata kunci tabel MySQL. Disebutkan di bawah ini adalah deskripsi dari semua kolom TableTop Table.
Id | Id unik untuk mengidentifikasi tabel. |
Kode | Kode tabel. |
Status | Nilai ulasan. |
Kapasitas | Total kapasitas tempat duduk Meja. |
Dibuat Pada | Menyimpan tanggal dan waktu pembuatan tabel. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu di mana tabel diperbarui. |
Konten | Kolom yang digunakan untuk menyimpan detail tambahan dari tabel. |
Tabel TableTop dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`table_top` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`code` VARCHAR(100) NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`capacity` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));
Meja Pemesanan dapat digunakan untuk memesan meja restoran baik secara online atau di tempat. Pengguna yang masuk atau yang sudah ada juga dapat dikaitkan dengan Pemesanan. Ini juga mengasumsikan bahwa hanya tabel yang memiliki status Gratis yang dapat Dipesan. Status tabel dapat diubah menjadi Dipesan setelah pemesanan dikonfirmasi. Juga, status tabel dapat diatur ke Aktif segera setelah tamu menempatinya. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Pemesanan.
Catatan :Tabel Pemesanan tidak mencakup pembayaran yang terkait dengan pemesanan meja. Ini dapat diperbarui lebih lanjut dengan menambahkan kolom tambahan untuk menangani pembayaran yang terlibat dalam pemesanan meja.
Id | Id unik untuk mengidentifikasi pemesanan. |
Id Tabel | Id tabel untuk mengidentifikasi tabel yang terkait dengan pemesanan. |
Id Pengguna | ID pengguna untuk mengidentifikasi pengguna terdaftar yang terkait dengan pemesanan. |
Token | Token unik yang terkait dengan pemesanan. |
Status | Status booking bisa New, Lounge, Active, dan Complete. |
Nama Depan | Nama depan tamu. |
Nama Tengah | Nama tengah tamu. |
Nama Belakang | Nama belakang pengguna. |
Seluler | Nomor ponsel pengguna. |
Email pengguna. | |
Baris 1 | Baris pertama untuk menyimpan alamat. |
Baris 2 | Baris kedua untuk menyimpan alamat. |
Kota | Kota alamat. |
Provinsi | Provinsi alamat. |
Negara | Negara alamat. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat pemesanan dibuat. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu pembaruan pemesanan. |
Konten | Kolom yang digunakan untuk menyimpan detail tambahan pemesanan. |
Tabel Pemesanan dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`booking` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tableId` BIGINT NOT NULL,
`userId` BIGINT NULL DEFAULT NULL,
`token` VARCHAR(100) NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`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,
`line1` VARCHAR(50) NULL DEFAULT NULL,
`line2` VARCHAR(50) NULL DEFAULT NULL,
`city` VARCHAR(50) NULL DEFAULT NULL,
`province` VARCHAR(50) NULL DEFAULT NULL,
`country` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_booking_table` (`tableId` ASC),
CONSTRAINT `fk_booking_table`
FOREIGN KEY (`tableId`)
REFERENCES `restaurant`.`table_top` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `restaurant`.`booking`
ADD INDEX `idx_booking_user` (`userId` ASC);
ALTER TABLE `restaurant`.`booking`
ADD CONSTRAINT `fk_booking_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION;
Tabel Item Pemesanan diperlukan untuk melacak barang yang dipesan oleh tamu. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Item Pemesanan.
Id | Id unik untuk mengidentifikasi item pemesanan. |
Id Pemesanan | Id pemesanan untuk mengidentifikasi pemesanan yang terkait dengan item pemesanan. |
Id Item | Id item untuk mengidentifikasi item yang terkait dengan item pemesanan. |
SKU | SKU item saat memesan. |
Harga | Harga jual barang saat pemesanan. |
Diskon | Diskon barang saat memesan. |
Kuantitas | Jumlah barang yang dipesan oleh pengguna. Ini bisa berupa pengganda unit item atau porsi tunggal. |
Satuan | Satuan Ukuran saat memesan Item. |
Status | Status untuk melacak kemajuan item. Bisa Baru, Dapur, Memasak, Dimasak, Disajikan. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat item pemesanan dibuat. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu pembaruan item pemesanan. |
Konten | Kolom yang digunakan untuk menyimpan detail tambahan dari item pemesanan. |
Tabel Item Pemesanan dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`booking_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`bookingId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_booking_item_booking` (`bookingId` ASC),
CONSTRAINT `fk_booking_item_booking`
FOREIGN KEY (`bookingId`)
REFERENCES `restaurant`.`booking` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION);
ALTER TABLE `restaurant`.`booking_item`
ADD INDEX `idx_booking_item_item` (`itemId` ASC);
ALTER TABLE `restaurant`.`booking_item`
ADD CONSTRAINT `fk_booking_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION;
Tabel Pesanan dan Tabel Item Pesanan
Bagian ini menyediakan tabel untuk mengelola pesanan. Pengguna yang masuk juga dapat dikaitkan dengan pesanan. Tabel pesanan dapat digunakan untuk menyimpan pemesanan yang telah selesai dan pesanan vendor. Status pesanan vendor dapat diatur ke baru saat melakukan pemesanan dan dapat diatur untuk diselesaikan setelah menerima item dari vendor. Juga, harga barang harus diisi secara manual setelah menerima barang dari vendor. Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Pesanan.
Id | Id unik untuk mengidentifikasi pesanan. |
Id Pengguna | ID pengguna untuk mengidentifikasi tamu yang terkait dengan pesanan. |
Id Vendor | Id vendor untuk mengidentifikasi vendor yang terkait dengan pesanan. |
Token | Token unik yang terkait dengan pesanan untuk menghubungkannya dengan pemesanan. Token yang sama juga dapat diteruskan ke Payment Gateway jika diperlukan. |
Status | Status pesanan bisa New, Checkout, Paid, Failed, Shipped, Delivered, Returned, dan Complete. Status Dikirim, Terkirim, dan Dikembalikan dapat digunakan untuk pesanan vendor. |
SubTotal | Harga Total Barang Pesanan. |
Diskon Barang | Total diskon untuk Item Pesanan. |
Pajak | Pajak atas Item Pesanan. |
Pengiriman | Biaya pengiriman Barang Pesanan. |
Total | Total harga Pesanan sudah termasuk pajak dan ongkos kirim. Itu tidak termasuk diskon item. |
Promo | Kode promo Pesanan. |
Diskon | Total diskon Pesanan berdasarkan kode promo atau diskon toko. |
Total Keseluruhan | Jumlah total pesanan yang harus dibayar oleh tamu ke restoran atau restoran ke vendor. |
Nama Depan | Nama depan pengguna. |
Nama Tengah | Nama tengah pengguna. |
Nama Belakang | Nama belakang pengguna. |
Seluler | Nomor ponsel pengguna. |
Email pengguna. | |
Baris 1 | Baris pertama untuk menyimpan alamat. |
Baris 2 | Baris kedua untuk menyimpan alamat. |
Kota | Kota alamat. |
Provinsi | Provinsi alamat. |
Negara | Negara alamat. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat pesanan dibuat. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu di mana pesanan diperbarui. |
Konten | Kolom yang digunakan untuk menyimpan detail tambahan pesanan. |
Tabel Pesanan dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`order` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NULL DEFAULT NULL,
`vendorId` BIGINT NULL DEFAULT NULL,
`token` VARCHAR(100) NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`subTotal` FLOAT NOT NULL DEFAULT 0,
`itemDiscount` FLOAT NOT NULL DEFAULT 0,
`tax` FLOAT NOT NULL DEFAULT 0,
`shipping` FLOAT NOT NULL DEFAULT 0,
`total` FLOAT NOT NULL DEFAULT 0,
`promo` VARCHAR(50) NULL DEFAULT NULL,
`discount` FLOAT NOT NULL DEFAULT 0,
`grandTotal` FLOAT NOT NULL DEFAULT 0,
`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,
`line1` VARCHAR(50) NULL DEFAULT NULL,
`line2` VARCHAR(50) NULL DEFAULT NULL,
`city` VARCHAR(50) NULL DEFAULT NULL,
`province` VARCHAR(50) NULL DEFAULT NULL,
`country` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_user` (`userId` ASC),
CONSTRAINT `fk_order_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `restaurant`.`order`
ADD INDEX `idx_order_vendor` (`vendorId` ASC);
ALTER TABLE `restaurant`.`order`
ADD CONSTRAINT `fk_order_vendor`
FOREIGN KEY (`vendorId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION;
Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Item Pesanan.
Id | Id unik untuk mengidentifikasi barang yang dipesan. |
Id Item | Id produk untuk mengidentifikasi item yang terkait dengan item yang dipesan. |
Id Pesanan | Id pesanan untuk mengidentifikasi pesanan yang terkait dengan barang pesanan. |
SKU | SKU item saat memesan. |
Harga | Harga barang saat memesan. |
Diskon | Diskon barang saat memesan. |
Kuantitas | Jumlah item yang dipilih oleh pengguna. |
Satuan | Satuan Ukuran saat memesan Item. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat item yang dipesan dibuat. |
Diperbarui Pada | Menyimpan tanggal dan waktu pembaruan item yang dipesan. |
Konten | Kolom yang digunakan untuk menyimpan detail tambahan dari barang yang dipesan. |
Tabel Item Pesanan dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`order_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`orderId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`quantity` FLOAT NOT NULL DEFAULT 0,
`unit` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_item_order` (`orderId` ASC),
CONSTRAINT `fk_order_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `restaurant`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `restaurant`.`order_item`
ADD INDEX `idx_order_item_item` (`itemId` ASC);
ALTER TABLE `restaurant`.`order_item`
ADD CONSTRAINT `fk_order_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `restaurant`.`item` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabel Transaksi
Kami juga membutuhkan meja transaksi untuk melacak pembayaran pesanan yang dilakukan oleh para tamu ke restoran dan restoran ke vendor untuk pembukuan. Kita juga dapat menggunakan tabel yang sama untuk mencatat transaksi kredit(tamu) dan debit(vendor). Disebutkan di bawah ini adalah deskripsi dari semua kolom Tabel Transaksi.
Id | Id unik untuk mengidentifikasi transaksi. |
Id Pengguna | ID pengguna untuk mengidentifikasi pengguna yang terkait dengan transaksi. |
Id Vendor | ID vendor untuk mengidentifikasi vendor yang terkait dengan transaksi. |
Id Pesanan | Id pesanan untuk mengidentifikasi pesanan yang terkait dengan transaksi. |
Kode | Id pembayaran yang disediakan oleh gateway pembayaran. |
Ketik | Jenis transaksi order dapat berupa Kredit atau Debit. |
Mode | Mode transaksi order bisa Offline, Cash On Delivery, Cheque, Draft, Wired, dan Online. |
Status | Status transaksi order bisa Baru, Dibatalkan, Gagal, Tertunda, Ditolak, Ditolak, dan Sukses. |
Dibuat Pada | Ini menyimpan tanggal dan waktu saat transaksi pesanan dibuat. |
Diperbarui Pada | Ini menyimpan tanggal dan waktu di mana transaksi pesanan diperbarui. |
Konten | Kolom yang digunakan untuk menyimpan detail tambahan transaksi. |
Tabel Transaksi dengan batasan yang sesuai adalah seperti yang ditunjukkan di bawah ini.
CREATE TABLE `restaurant`.`transaction` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`vendorId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`code` VARCHAR(100) NOT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`mode` SMALLINT(6) NOT NULL DEFAULT 0,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_transaction_user` (`userId` ASC),
CONSTRAINT `fk_transaction_user`
FOREIGN KEY (`userId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `restaurant`.`transaction`
ADD INDEX `idx_transaction_vendor` (`vendorId` ASC),
ADD INDEX `idx_transaction_order` (`orderId` ASC);
ALTER TABLE `restaurant`.`transaction`
ADD CONSTRAINT `fk_transaction_vendor`
FOREIGN KEY (`vendorId`)
REFERENCES `restaurant`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ADD CONSTRAINT `fk_transaction_order`
FOREIGN KEY (`orderId`)
REFERENCES `restaurant`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabel Alamat
An address table can be used to avoid the redundant columns in the Booking and Order table depending on the actual implementation. It can be directly mapped to the Booking Table and Order Table using the appropriate foreign keys.
Ringkasan
In this tutorial, we have discussed the database design of a Restaurant Ordering System or Food Ordering System to store the users, book tables, automate kitchen, and manage product inventory. The same database schema can be used to accept online table booking and pre-orders. The database schema provided in this tutorial can be considered as the starting point and further optimized or updated based on the actual needs. The On-Premises Restaurant Ordering System Flowchart can be referred to implement the restaurant order system.
Anda dapat mengirimkan komentar Anda untuk bergabung dalam diskusi. You may also be interested in designing the database of the Blog, Online Shopping Cart, and Poll &Survey applications. Skema database lengkap juga tersedia di GitHub.