Lý lịch
Tôi là sinh viên CS năm thứ nhất và tôi làm việc bán thời gian cho doanh nghiệp nhỏ của bố tôi. Tôi không có kinh nghiệm phát triển ứng dụng trong thế giới thực. Tôi đã viết các kịch bản bằng Python, một số khóa học bằng C, nhưng không có gì như thế này.
Cha tôi có một doanh nghiệp đào tạo nhỏ và hiện tại tất cả các lớp được lên lịch, ghi lại và theo dõi thông qua một ứng dụng web bên ngoài. Có một tính năng xuất / "báo cáo" nhưng nó rất chung chung và chúng tôi cần báo cáo cụ thể. Chúng tôi không có quyền truy cập vào cơ sở dữ liệu thực tế để chạy các truy vấn. Tôi đã được yêu cầu thiết lập một hệ thống báo cáo tùy chỉnh.
Ý tưởng của tôi là tạo các bản xuất và nhập CSV chung (có thể bằng Python) vào cơ sở dữ liệu MySQL được lưu trữ trong văn phòng mỗi đêm, từ đó tôi có thể chạy các truy vấn cụ thể cần thiết. Tôi không có kinh nghiệm về cơ sở dữ liệu nhưng hiểu những điều cơ bản. Tôi đã đọc một chút về việc tạo cơ sở dữ liệu và các hình thức bình thường.
Chúng tôi có thể bắt đầu có khách hàng quốc tế sớm, vì vậy tôi muốn cơ sở dữ liệu không phát nổ nếu / khi điều đó xảy ra. Chúng tôi hiện cũng có một vài tập đoàn lớn là khách hàng, với các bộ phận khác nhau (ví dụ: công ty mẹ ACME, bộ phận chăm sóc sức khỏe ACME, bộ phận chăm sóc cơ thể ACME)
Lược đồ tôi đã đưa ra là như sau:
- Từ góc độ khách hàng:
- Khách hàng là bàn chính
- Khách hàng được liên kết với bộ phận họ làm việc cho
- Các phòng ban có thể nằm rải rác trên một quốc gia: Nhân sự ở Luân Đôn, Tiếp thị ở Swansea, v.v.
- Các phòng ban được liên kết với bộ phận của một công ty
- Các bộ phận được liên kết với công ty mẹ
- Từ quan điểm của lớp học:
- Phiên là bàn chính
- Một giáo viên được liên kết với mỗi phiên
- Một trạng thái được đưa ra cho mỗi phiên. Ví dụ 0 - Đã hoàn thành, 1 - Đã hủy
- Các phiên được nhóm thành "gói" có kích thước tùy ý
- Mỗi gói được gán cho một khách hàng
- Phiên là bàn chính
Tôi "thiết kế" (giống như viết nguệch ngoạc) lược đồ trên một tờ giấy, cố gắng giữ nó bình thường hóa ở dạng thứ 3. Sau đó tôi đã cắm nó vào MySQL Workbench và nó làm cho tất cả đều đẹp đối với tôi:
( Bấm vào đây để xem đồ họa có kích thước đầy đủ )
(nguồn: maian.org )
Các truy vấn mẫu tôi sẽ chạy
- Những khách hàng nào còn tín dụng vẫn không hoạt động (những khách hàng không có lớp dự kiến trong tương lai)
- Tỷ lệ tham dự của mỗi khách hàng / bộ phận / bộ phận (được đo bằng id trạng thái trong mỗi phiên)
- Có bao nhiêu lớp có một giáo viên trong một tháng
- Cờ khách hàng có tỷ lệ tham dự thấp
- Báo cáo tùy chỉnh cho các phòng nhân sự với tỷ lệ tham dự của những người trong bộ phận của họ
Câu hỏi
- Đây có phải là quá áp đảo hay tôi đang đi đúng hướng?
- Có cần phải tham gia nhiều bảng cho hầu hết các truy vấn dẫn đến một hiệu suất lớn không?
- Tôi đã thêm một cột 'lastsession' cho khách hàng, vì nó có thể sẽ là một truy vấn phổ biến. Đây có phải là một ý tưởng tốt hay tôi nên giữ cho cơ sở dữ liệu được chuẩn hóa nghiêm ngặt?
cảm ơn vì đã dành thời gian cho tôi
divisions
có cột được đặt tên divisionid
. Bạn không thấy dư thừa à? Chỉ cần đặt tên cho nó id
. cũng tên bảng của bạn bao gồm _has_
: tôi sẽ loại bỏ nó và chỉ đặt tên nó chẳng hạn cities_departments
. các DATETIME
cột của bạn phải là loại TIMESTAMP
trừ khi chúng là giá trị đầu vào của người dùng. Tôi nghĩ rằng đó là một ý tưởng tốt để có cities
và countries
bảng. bạn có thể gặp rắc rối trong việc giới hạn các bảng thành một status
. xem xét việc sử dụng một INT
và thực hiện so sánh bitwise trên nó - vì vậy bạn có thể nắm giữ nhiều ý nghĩa hơn ở đó