Có một số câu hỏi / vấn đề ở đây, vì vậy tôi sẽ cố gắng giải quyết từng câu hỏi / vấn đề.
Tất cả các tương tác trong giải đấu phải là thời gian thực / được phản ánh cho nhiều người dùng.
Đối với lưu lượng truy cập vừa và nhỏ trên trang web của bạn, đây có thể không phải là vấn đề. Đối với giao thông đông đúc hơn, điều này sẽ nhanh chóng bắt đầu trở thành một vấn đề lớn.
Hãy xem xét như một ví dụ về tần suất bạn muốn thăm dò cơ sở dữ liệu bằng các lệnh gọi AJAX của mình. Mỗi giây? Vì vậy, nếu bạn có 100 người mở một trang, bạn có 100 cuộc gọi cơ sở dữ liệu mỗi giây? Bạn sẽ thấy rằng điều đó sẽ nhanh chóng giết chết cơ sở dữ liệu của bạn.
Mặc dù điều này hơi lạc đề, tôi thực sự khuyên bạn nên tìm hiểu cách lưu trữ kết quả giải đấu vào bộ nhớ cache trước thời hạn. Bạn có thể lưu thống kê vào bộ nhớ cache, v.v. và để chúng hết hạn hoặc chủ động hết hạn, nhưng chắc chắn hãy dành thời gian nghiên cứu nó.
Số liệu thống kê / kết quả thời gian thực
Hãy nhớ rằng việc kết hợp mất thời gian trong cơ sở dữ liệu quan hệ. Nếu bạn bình thường hóa cấu trúc giải đấu của mình một cách quá mức, thì việc nhận được số liệu thống kê có thể rất khó khăn. Phần khó nhất của hệ thống để làm cho hiệu quả sẽ là tổng hợp và thống kê từ mỗi giải đấu.
Khi bạn thiết kế cơ sở dữ liệu / bảng / chế độ xem / thủ tục được lưu trữ của mình, hãy ghi nhớ mục tiêu cuối cùng - nhận số liệu thống kê một cách nhanh chóng. Điều này có thể có nghĩa là không chuẩn hóa dữ liệu quá nhiều (để tránh quá nhiều kết nối). Nó cũng có thể có nghĩa là chú ý rất kỹ đến các kiểu dữ liệu của bạn - ví dụ:sử dụng bit / short / etc. thay vì số nguyên.
Cách lập mô hình các loại giải đấu khác nhau
Tôi không rành về các mô hình giải đấu, nhưng tôi có lời khuyên cụ thể về cách lập mô hình. =)
Một số câu hỏi bạn nên tự hỏi:
-
Có phải tất cả các giải đấu đều có sân chung không? Nói cách khác, đối với một giải đấu vòng tròn tính điểm, chúng tôi lưu trữ 10 trường. Đối với một giải đấu loại trực tiếp, chúng tôi lưu trữ 11 lĩnh vực. Nếu họ chia sẻ 10 trường giống nhau, thì tôi khuyên bạn nên đặt tất cả các loại giải đấu vào một bảng và sau đó sử dụng trường giải_điểm để xác định loại giải đấu cho ứng dụng của bạn.
-
Có phải tất cả các giải đấu không có sân chung không? Đặt chúng thành các bảng riêng biệt - một bảng cho mỗi loại giải đấu. Bạn có thể tạo một bảng cho dữ liệu được chia sẻ, nhưng sau đó có các bảng khác nhau cho thông tin cụ thể.
-
Các lĩnh vực giải đấu có phát triển khác nhau theo thời gian không ? Theo thời gian, bạn sẽ muốn thêm các trường vào các loại giải đấu. Nếu bạn dự đoán các giải đấu sẽ trở nên rất độc đáo và rất cụ thể theo thời gian, hãy tách chúng ra. Nếu không, bạn sẽ có rất nhiều trường có hàng tấn giá trị NULL trong đó.
-
Bạn đã xem xét một giải pháp NoSQL chưa ? Điều thú vị về cửa hàng NoSQL là nó không chuẩn hóa dữ liệu để bạn không có các phép nối. Ngoài ra, bạn có thể có không đồng nhất (các loại dữ liệu khác nhau) trong cùng một "bảng" hoặc vùng chứa. Chỉ là một cái gì đó để xem xét vì nó có thể làm cho cuộc sống của bạn dễ dàng hơn đáng kể. Hãy xem MongoDB làm ví dụ.