Rất tốt, mình thì không rành về CSDL, cũng tự học và ở mức ABC thôi, nhưng mình có cách tiếp cận để giải bài của bạn, và chia sẻ nó với bạn như này để bạn dễ làm nè.
Bạn tự điều chỉnh trên sơ đồ thiết kế của bạn, mình chỉ diễn giải trong thực tế phòng khám để bạn hình dung thay vì lý luận một lát dẫn đến rối beng. Tại sao là rối beng? Ví dụ như này: trong thực tế bạn có đi khám thì bạn mới biết rằng toa thuốc và hoá đơn, trong toa thuốc thì chỉ có tên thuốc, trong hoá đơn có cả giá tiền. Nhưng có phải đơn giản vậy không? Nhiều lúc hoá đơn lại là tên loại thuốc thay thế chứ tên thuốc không hoàn toàn giống như trong toa.
Cũng có thể làm các table trung gian chứa các kết quả query. Hoặc nó chỉ là trong lập trình đó là tuỳ bạn có đứng luôn về lập trình hay chỉ làm CSDL.
1 hoá đơn sẽ gồm có các thông tin khi in ra (còn lưu dữ liệu sẽ nhiều hơn hoặc ít hơn, khi in thì kết xuất từ nhiều table khác nhau nhé, đừng nhầm lẫn in hoá đơn chính là table hoá đơn). Các mục:
- Hoá đơn số/ số hoá đơn - đây là mã để phân biệt các hoá đơn, có thể là số thứ tự hoặc kết hợp sao đó để mỗi hoá đơn là duy nhất
- Ngày tháng hoá đơn (có thể chính xác giờ, phút)
- Tên người Nhân viên xuất hoá đơn
- Tên Người thanh toán/ khách hàng/ tên bệnh nhân (ở đây là con chó/ mèo)
- Tiêu đề hoá đơn, có thể là “Hoá đơn dịch vụ thú y Hoa Đà” hoặc… tự đặt theo danh mục qui định cho trước.
- Các dòng liệt kê tính tiền: mỗi dòng có thể là một dịch vụ/ tên thuốc. Có thể khi liệt kê chia làm các phần khác nhau để dễ đọc hơn.
Ví dụ:
Dịch vụ
- Bấm móng chân mèo - 25K;
- Khám bụng sóc - 60K
Thuốc/ sản phẩm bổ trợ
- Thuốc chữa rụng lông chó - 80K;
- Dung dịch vệ sinh vết thương mèo - 40K;
- Tổng số tiền phải thanh toán (đơn giản là phép cộng mấy cái dòng kia)
Như vậy, khi nhìn qua ta sẽ thấy table Hoá đơn thực ra chỉ có khoá chính là mã và ngày giờ là thuộc về chính nó, còn lại thì nó toàn là trường từ các table khác. Bạn muốn có những thông tin gì thì cứ liệt kê vào.
Các nghiệp vụ khác bạn cũng làm tương tự như phân tích 1 hoá đơn ở trên, nói chung là lấy tờ giấy ngồi liệt kê ra, quan sát, suy nghĩ xem nên đặt dữ liệu ở table nào.
Nên gom hết giấy tờ của 1 phòng khám thú y hoặc bỏ công phỏng vấn 1 chủ phòng khám thú y để liệt kê ra những cái gì đang xảy ra. Viết nó ra từng tờ giấy và đặt lên trên bàn như phơi sách vậy để dễ hình dung chuyện gì xảy ra từ lúc 1 người mang một con chó/ con mèo tới phòng khám -> gặp cô tiếp tân, cô ấy sẽ nhập gì vào máy. Rồi khi chẩn đoán, kê toa hoặc thực hiện thao tác thú y như phẫu thuật, khâu vá hay bó bột gì đó thì thông tin này sẽ thế nào.
Rồi sau đó, khi người ta khám cho con vật thì làm gì tiếp, có nhập thông tin gì tiếp theo? Ví dụ bác sĩ kê đơn con chó này cần mua 5 liều thuốc, thì nhập những thông tin gì, nếu khám tổng quát thì ghi gì, khám bụng ghi gì, khám chân ghi gì?
Tiếp tục nữa là nếu con chó mèo đó có lịch hẹn tái khám thì có quản lý cái này không? Từ những cái này ta mới rã về dữ liệu, chia về các column trong các table, sau khi dời qua chuyển lại chán chê, phân tích rõ để quyết định khoá chính, khoá ngoại, kiểu loại dữ liệu.
Không phải tất tần tật cái gì cũng quản lý, mà tuỳ qui mô để ta nên làm cái gì, ôm đồm quá nó phình to lắm.
Ngày trước mình làm BA là làm mấy cái trên sau đó mang về rồi mới mô tả là bằng sơ đồ rồi mới đưa cho mấy bạn lập trình, và họ phân công người thiết kế cơ sở dữ liệu rồi có buổi họ ngồi mô tả lại xem họ và mình có hiểu giống nhau về một nghiệp vụ hay không. Nói chung là “lập trình trên giấy, trên bảng” chán chê mải mê rồi mới đưa vào máy tính để biến nó thành CSDL, thành code.
Từ đó bạn sẽ ôn lại kiến thức CSDL là quan hệ 1-1 hay nhiều - 1 hay nhiều - nhiều. Và cũng xác định xem bạn định thiết kết đạt chuẩn 1NF, 2NF, 3NF, chuẩn BC hay chuẩn gì đó mà điều chỉnh bởi vì không có mẫu số chung cho thiết kế. Có người chú trọng hiệu suất nên họ chấp nhận dữ liệu có sự dư thừa/ trùng lắp phần nào, có người lại kiên quyết thiết kế phải đạt chuẩn.
Quay lại chuyện là một con thú tới khám khác với con người như bạn nói, nghĩa là một bác sĩ thú y có thể khám răng, khám chân, khám bụng. Vậy thì thông tin mà họ ghi lại là như thế nào? Và bạn sẽ làm rõ là cần cất vào một/ nhiều table ra làm sao, chia làm mấy cột (giả sử để sau này có thể lọc thông tin nhằm khám phá xem chó hay bị bệnh nào, mèo bị bệnh nào nhiều nhất…)