Asked Mar 23rd, 2021 2:44 a.m. 142 0 3
  • 142 0 3
+3

Nhờ mọi người tư vấn về thiết kế database để xử lý của code đc tối ưu

Share
  • 142 0 3

Chào cả nhà!
Em đang gặp 1 vấn đề về thiết kế db, mong mọi người giúp đỡ ạ.
Em đang sử dụng Mysql ạ.

Bài toán: Ứng dụng đặt bàn ăn.
Một nhà hàng: có nhiều bàn ăn, có nhiều options ăn cho khách hàng lựa chọn ( ăn trong 1 tiếng, 1 tiếng rưỡi, 2 tiếng... ) Khi khách hàng vào website có thể đặt bàn bằng cách:

  • Chọn ngày
  • Chọn option thời gian ăn

Việc của ứng dụng là dựa vào thông tin của khách hàng nhập sẽ kiểm tra:

  • Với ngày khách hàng chọn và option thời gian ăn của họ thì có những khung giờ nào họ có thể đặt. (khung giờ sẽ đc kiểm tra bằng cách kiểm tra xem còn bàn còn trống khung giờ nào thì hiển thị ạ)
    Em đang gặp khó khăn về db, làm sao thiết kế cho hợp lý, để code xử lý đc hiệu quả và nhanh.
    Mong a chị giúp đỡ ạ.

3 ANSWERS


Answered Mar 23rd, 2021 4:16 a.m.
+2

Trong bảng [Bàn] sẽ có khung giờ bắt đầu và kết thúc và sẽ có field khung giờ đã được lựa chọn. Khi người dùng chọn bàn, bạn sẽ query đến bàn đó và đưa ra khung giờ bắt đầu chọn, khi người dùng chọn khung giờ bắt đầu bạn sẽ check xem thời gian người dùng có thể ăn là bao lâu dựa vào field khung giờ đã chọn.

Nhưng mình có suggest là hệ thống sẽ hiện khoảng thời gian cho người dùng chọn. Như vậy việc sử xý code của bạn sẽ dễ dàng hơn và đỡ phải phí các khoảng thời gian chêch lệch giữa 2 người dùng.

Share
Avatar iamfresher @benkyou
Mar 23rd, 2021 6:03 a.m.

@thangly98 Cảm ơn bạn, người dùng ko chọn bàn bạn ạ.
Như mình mô tả thì họ chỉ nhập ngày đi ăn và muốn ngồi trong bao nhiêu thời gian.
Là hệ thống phải check đc các khung giờ của toàn bộ các bàn để trả về trên UI cho họ chọn.
Hơi lằng nhằng phức tạp nên mình vẫn chưa nghĩ đc cách nào tối ưu 😦

0
| Reply
Share
Mar 23rd, 2021 7:32 a.m.

@benkyou Xin lỗi mình đọc chưa kĩ, và bạn có thể tham khảo cách này (nó theo cách của nosql)

table = { id, name, active: true/false, maxPeople, timeId, booking } 
time = { id, name: '1 hour / 1.5 hours / 2 hours', timeSlot: [ { start, end } ... ] }  
booking = { id, tableId, time: { start, end } }

Ví dụ:

  • Bàn A:
    • Có khung giờ để booking:
      1 hour : 8 - 9, 8,5 - 9,5, ...
      1.5 hours: 8h - 9.5, 9.5 - 11, ... ...
    • Khách đặt 8.5 - 9,5

-> Các khung giờ còn lại khách có thể chọn là: (start < start booking && end < start booking) || (start > end booking && end > end booking)
thường thì các khoảng thời gian sẽ cách nhau 15p, nên mình sẽ không so sánh hoặc bằng

Note: Đây là case cho một ngày, bạn cần check ngày nếu có chức năng booking ở tương lai

+1
| Reply
Share
Answered Mar 23rd, 2021 4:13 a.m.
+1
  • store_calendar: lịch làm việc, giờ bắt đầu, giờ kết thúc, các ngày làm việc trong tuần
  • store_stop_time: thời gian ngừng làm việc của store
  • booking_stocks: các loại bàn ăn
  • booking_stock_options: các loại option có thể có của từng loại booking
  • bookings: lưu các booking của khách hàng.

Viết câu query kiểu gì build ra được cái calendar giống vậy là được http://jsfiddle.net/Xx4GS/258/ không thì làm kiểu giống bàn cờ caro hay time schedule table, tùy kích cỡ màn hình.

Share
Answered Mar 23rd, 2021 5:05 a.m.
0

Cách của mình:

  • stores (bàn ăn):
    • ID (1-> n)
  • bookings:
    • ID
    • booking_code (mã booking)
    • customer_name (name khách hàng)
    • customer_phone (phone khách hàng)
    • booking_store_id (bàn ăn số 1-> n)
    • booking_hours (số giờ ăn 1,2,3 ... giờ)
    • booking_start_time (thời gian bắt đầu ăn)
    • booking_end_time (thời gian kết thúc ăn)
    • booking_status (1: mặc định khi đặt bàn , 2: hủy, 3: hoàn thành)
Share
Viblo
Let's register a Viblo Account to get more interesting posts.