Thiết kế Database Quản lý Khách sạn: Từ "Tay mơ" đến "Chuyên nghiệp"
Chào anh em, lại là mình đây!
Hồi mới bắt đầu làm mấy dự án quản lý khách sạn (Hotel Management System), mình từng nghĩ: "Chắc chỉ cần cái bảng Phòng với bảng Khách là xong nhỉ?". Nhưng đời không như là mơ. Đến khi đụng vào thực tế mới thấy nào là hóa đơn, dịch vụ đi kèm, rồi cả vụ quản lý kho (inventory) cho mini bar... nó là một ma trận thực sự.
Hôm nay, nhân lúc ngồi rà lại cái sơ đồ Database (ERD) mà mình tâm đắc, mình quyết định lên một bài chia sẻ chi tiết để anh em nào đang định làm đồ án hay dự án cá nhân có một cái khung "chuẩn chỉnh" mà dùng, đỡ phải đập đi xây lại như mình ngày xưa.

1. Cái nhìn tổng quan: Đừng để sơ đồ làm bạn choáng!
Nhìn vào cái hình trên, anh em đừng sợ nhé. Về cơ bản, chúng ta có thể chia "vương quốc" này thành 5 cụm chính:
- Cụm Nhân sự & Bảo mật:
Employees,Accounts,Roles,Authorities. - Cụm Khách hàng:
Customers,CustomerTypes,CustomerGroups. - Cụm Vận hành chính:
Rooms,RoomTypes,Bookings,Vouchers. - Cụm Hóa đơn & Thanh toán:
Invoices,Payments,InvoiceDetails. - Cụm Dịch vụ & Kho:
ServiceDetails,InventoryReceiving,InventoryDelivery.
Giờ mình cùng đi sâu vào "xương sống" của nó nhé.
2. Xương sống của hệ thống: Đặt phòng và Quản lý phòng
Mọi thứ trong khách sạn đều xoay quanh cái Booking.
Bookings: Đây là nơi lưu mọi thông tin "biến động". Khách nào (customer_id), phòng nào (room_id), check-in ngày nào, đặt cọc bao nhiêu.
Rooms & RoomStatus: Một lỗi người mới hay mắc là để thẳng trạng thái "Trống/Có khách" vào bảng Room. Lời khuyên là nên tách bảng RoomStatus ra để sau này anh em có thêm các trạng thái như "Đang dọn dẹp", "Đang sửa chữa" thì chỉ cần thêm record, không cần sửa code.
💡 Tips từ kinh nghiệm: Bảng BookingHistories là cực kỳ quan trọng. Khách đổi phòng, hủy phòng hay thay đổi yêu cầu đặc biệt? Lưu hết vào đây để sau này còn "đối chất" và làm báo cáo.
3. Quản lý Khách hàng: Không chỉ là lưu cái tên
Anh em nhìn vào cụm bên trái sơ đồ sẽ thấy CustomerGroups và GroupMembers. Tại sao?
Vì khách sạn thường có khách đi theo đoàn (tour, công ty). Việc group khách lại giúp chúng ta quản lý hóa đơn tổng cho cả đoàn dễ dàng hơn thay vì ngồi cộng tay từng người.
4. "Nỗi đau" mang tên Dịch vụ và Kho (Inventory)
Đây là phần mà nhiều anh em làm đồ án hay bỏ qua, nhưng đi làm thật thì nó lại là "long mạch".
ServiceDetails: Nơi lưu menu từ Coca, mì tôm đến giặt ủi.
InventoryReceiving/Delivery: Đây chính là quản lý Nhập - Xuất kho. Khi khách khui một lon bia trong tủ lạnh, hệ thống phải tự hiểu là xuất kho (Delivery). Nếu anh em không làm phần này, quản lý khách sạn sẽ chẳng biết tại sao bia trong kho cứ "bay màu" mà không thấy tiền đâu.
5. Hóa đơn (Invoices): Chốt hạ cuộc chơi
Sau khi khách hưởng đủ các dịch vụ, bảng Invoices sẽ "tổng sỉ vả" tất cả.
Nó liên kết với Bookings (tiền phòng).
Nó liên kết với InvoiceDetails (tiền dịch vụ).
Đừng quên bảng Payments để biết khách thanh toán bằng tiền mặt, chuyển khoản hay quẹt thẻ nhé.
6. Lời kết và hướng phát triển
Sơ đồ này đã khá bao quát cho một dự án tầm trung. Tuy nhiên, nếu anh em muốn làm nó "pro" hơn, có thể cân nhắc thêm:
Log hệ thống: Ai là người sửa giá phòng? Ai là người hủy booking? (Lưu vào bảng Logs).
Pricing Policy: Giá phòng ngày lễ, ngày thường khác nhau.
Hy vọng sơ đồ và những chia sẻ "máu thịt" này của mình sẽ giúp anh em có một khởi đầu dễ thở hơn với dự án quản lý khách sạn. Anh em thấy thiếu sót chỗ nào hay có cách thiết kế nào tối ưu hơn thì cùng thảo luận ở phần comment nhé!
Chào thân ái và quyết thắng!
All Rights Reserved