I have been search for a solution for a similar case. I have an appointment app where users can book doctors based on their available time slot. I have created a time slot table and booking table. Where am not sure is, if a doctor's time slot is taken for a particular date how do I ensure another user does not pick the same time slot for that same date.
CREATE TABLE `time_slots` (
`slot_id` int NOT NULL AUTO_INCREMENT,
`package_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`dr_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`start_time` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`end_time` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`weekday` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`s_time_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`created_at` datetime(0) NULL DEFAULT NULL,
`updated_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
PRIMARY KEY (`slot_id`) USING BTREE
)
CREATE TABLE `appointments` (
`appointment_id` int NOT NULL AUTO_INCREMENT,
`patient_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`doctor_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`time_slot` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`start_time` datetime(0) NULL DEFAULT NULL,
`end_time` datetime(0) NULL DEFAULT NULL,
`time_slot_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`auth_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`confirmed` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`invoice_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`created_at` datetime(0) NULL DEFAULT NULL,
`updated_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
PRIMARY KEY (`appointment_id`) USING BTREE
)