Cuối cùng, nó đi xuống để sử dụng và kiến trúc.
Ngành kiến trúc
Hệ thống có xử lý "môn thể thao nào" không? Có phải ý tưởng mà bạn đội chiếc mũ phi hành gia kiến trúc của bạn, và xây dựng một hệ thống chung có thể xử lý bất kỳ loại thể thao nào trong tương lai thậm chí không tồn tại ngày nay?
Nếu vậy, rõ ràng việc có các bảng được đặt tên động là một nỗi đau rất lớn, do đó, sẽ có ý nghĩa khi có một lược đồ hỗ trợ n môn thể thao, nếu cần.
Điều đó nói rằng, tôi có một thành kiến rất mạnh mẽ đối với phương pháp này: điều này hầu như luôn luôn làm việc nhiều hơn và dẫn đến kết quả kém hơn. Tạo một UI, lược đồ, v.v., cho mỗi môn thể thao cuối cùng sẽ dẫn đến trải nghiệm người dùng tốt hơn và dễ duy trì mã hơn, ngay cả khi điều đó có nghĩa là một số lượng trùng lặp hời hợt (làm thế nào để tránh / giảm thiểu đây là một câu hỏi riêng biệt).
Làm thế nào để bạn xử lý những người chơi chơi nhiều môn thể thao? Họ có nhận được hai mục (ví dụ: bạn đối xử như những người khác nhau) hoặc bạn đang cố gắng làm điều gì đó cụ thể với họ?
Sử dụng
Vì vậy, giả sử bạn không chơi thể thao một cách linh hoạt (ví dụ: nếu ai đó muốn thêm một môn thể thao mới, nó đòi hỏi nỗ lực phát triển để thêm nó).
Có khi nào bạn hiển thị người chơi (hoặc bất kỳ đối tượng nào khác mà bạn đã đề cập) từ nhiều môn thể thao cùng một lúc không?
Tôi có thể thấy điều này cho chức năng tìm kiếm, nơi bạn có thể tìm kiếm theo tên người chơi hoặc tên đội (bất kể môn thể thao nào), nhưng ngoài ra tôi không thể tưởng tượng được nhiều trường hợp sử dụng.
Nếu bạn không bao giờ cần phải làm điều này, thì cách tiếp cận của bạn là hoàn toàn tốt. Bạn có thể dừng đọc ở đây.
Lược đồ thay thế
Lượt xem
Tôi là một fan hâm mộ của KISS. Trong hơn 15 năm phát triển phần mềm, tôi tiếp tục quay trở lại với triết lý "xây dựng điều đơn giản nhất có hiệu quả".
Vì vậy, phản ứng ban đầu của tôi, giả sử chức năng tìm kiếm đa môn thể thao thực sự là trường hợp sử dụng duy nhất, là tạo ra các lượt xem:
SELECT PlayerName, 'NFL' as [Sport], TeamName FROM NFL_Players JOIN NFL_Teams ...
UNION
SELECT PlayerName, 'NHL' as [Sport], TeamName FROM NHL_Players JOIN NHL_Teams ...
UNION ....
Tất nhiên, nếu bạn thêm một môn thể thao mới, bạn phải thêm vào chế độ xem. Nó cũng có thể hữu ích để bao gồm các thông tin phổ biến khác nhưng thực sự phụ thuộc vào những gì cần được hiển thị.
Tôi sẽ cố gắng giữ tất cả nội dung dành riêng cho thể thao trong định nghĩa Chế độ xem, vì vậy mã tìm kiếm không cần phải có nhiều hoặc bất kỳ mã cụ thể nào (ngoài việc có thể biết cách liên kết với /nhl/players/player-name
vs /nfl/...
hoặc tuy nhiên ứng dụng của bạn làm điều đó).
Bảng kế thừa
Kế thừa bảng có thể làm việc, nhưng khá phức tạp. Tôi không có nhiều kinh nghiệm với nó và trên thực tế, tôi nghĩ rằng mỗi lần tôi tham gia vào việc đánh giá nó, chúng tôi lại làm một việc đơn giản hơn (như tôi đang gợi ý ở đây).
Vì vậy, cá nhân tôi vẫn chưa tìm thấy lý do tại sao điều này sẽ hữu ích, nhưng có lẽ có một trường hợp sử dụng thuyết phục (mà tôi không biết) chứng minh sự phức tạp (ví dụ, kế thừa Bảng giải quyết trường hợp sử dụng tốt hơn bất kỳ giải pháp nào khác) .
Các bảng riêng biệt cho các thuộc tính dành riêng cho thể thao
Bạn có thể thực hiện một players
bảng duy nhất có các thuộc tính chung cho tất cả người chơi của tất cả các môn thể thao và sau đó một nhóm bảng nhl_players_details
khác có chứa một playerId và các cột có thông tin bổ sung về người chơi. Nếu có rất nhiều thuộc tính phổ biến hoặc bạn có nhiều cách sử dụng "tất cả người chơi từ tất cả các môn thể thao" thì điều này có thể có ý nghĩa.
Các cặp giá trị chính cho các thuộc tính dành riêng cho thể thao
Cách tiếp cận hoàn toàn khác: có một players
bảng (một lần nữa, với các thuộc tính thông thường như tên) và sau đó một player_data
bảng mà có PlayerId
, Sport
, Attribute
, Value
. Tên thuộc tính được nhập sẽ là đặc trưng cho thể thao. Điều này cho phép bạn về cơ bản thêm các thuộc tính mới mà không cần sửa đổi lược đồ (mã của bạn vẫn phải biết để tải / hiển thị chúng tất nhiên). Hạn chế là bạn mất một số tính toàn vẹn: giá trị thường là trường chuỗi, vì vậy mã ứng dụng của bạn sẽ phải linh hoạt và xử lý các lỗi tiềm ẩn khi chuyển chuỗi value
thành loại dữ liệu cụ thể (như số nguyên).
Khái niệm này tất nhiên có thể áp dụng cho Đội, Trò chơi, v.v.