Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Panduan Merancang Database Untuk Sistem Pemesanan Restoran Di MySQL

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 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 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 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengekstrak dua digit berturut-turut dari bidang teks di MySQL?

  2. Cara Mendapatkan Kencan Kemarin di MySQL

  3. Bagaimana saya bisa menghitung jumlah baris yang dikembalikan oleh kueri MySQL?

  4. Pilih TOP X (atau terbawah) persen untuk nilai numerik di MySQL

  5. Kesalahan MySql 150 - Kunci asing