In definitiva, si riduce all'uso e all'architettura.
Architettura
Il sistema gestisce "qualsiasi sport"? L'idea di indossare il tuo cappello da astronauta in architettura e costruire un sistema generico in grado di gestire qualsiasi tipo di sport futuro che potrebbe non esistere oggi?
In tal caso, ovviamente avere tabelle con nomi dinamici è una vera seccatura, quindi avrebbe senso avere uno schema che supporti n sport, se necessario.
Detto questo, ho un forte pregiudizio nei confronti di questo approccio: questo è quasi sempre più lavoro e porta a risultati più scarsi. Fare un'interfaccia utente, uno schema, ecc. Separati per ogni sport alla fine porterà a una migliore esperienza utente e a mantenere più facilmente il codice, anche se ciò significa una quantità superficiale di duplicazione (come evitare / minimizzare questa è una domanda separata).
Come gestisci i giocatori che praticano più sport? Ricevono due voci (ad esempio, trattate come persone diverse) o state provando a fare qualcosa di specifico con loro?
Uso
Quindi supponiamo che tu non pratichi sport in modo dinamico (ad esempio, se qualcuno vuole aggiungere un nuovo sport, è necessario uno sforzo di sviluppo per aggiungerlo).
C'è mai un momento in cui stai mostrando giocatori (o qualsiasi altro oggetto che hai citato) di più di uno sport alla volta?
Potrei vedere questo per una funzione di ricerca, in cui puoi cercare per nome del giocatore o della squadra (indipendentemente dallo sport), ma oltre a ciò non riesco a immaginare molti casi d'uso.
Se non hai mai bisogno di farlo, il tuo approccio è perfetto. Puoi smettere di leggere qui.
Schemi alternativi
Visualizzazioni
Sono un fan di KISS. In oltre 15 anni di sviluppo software, continuo a ripiegare sulla filosofia "costruire la cosa più semplice che funzioni".
Quindi la mia reazione iniziale, supponendo che una funzione di ricerca cross-sport sia davvero l'unico caso d'uso, è quella di creare viste:
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 ....
Naturalmente, se aggiungi un nuovo sport, devi aggiungere alla vista. Può anche essere utile includere altre informazioni comuni, ma in realtà dipende da ciò che deve essere mostrato.
Proverei a mantenere tutte le cose specifiche per lo sport nella definizione di visualizzazione, quindi il codice di ricerca non ha bisogno di avere molto o alcun codice specifico (oltre a forse sapere come collegarsi a /nhl/players/player-name
vs /nfl/...
o comunque la tua app lo fa).
Ereditarietà della tabella
L'ereditarietà delle tabelle può funzionare, ma è piuttosto complessa. Non ho molta esperienza con esso, e in effetti, penso che ogni volta che sono stato coinvolto nella valutazione, abbiamo finito per fare qualcosa di più semplice (come sto suggerendo qui).
Quindi, personalmente, devo ancora scoprire perché questo sarebbe utile, ma forse esiste un caso d'uso convincente (che non conosco) che giustifica la complessità (ad esempio, l'ereditarietà delle tabelle risolve il caso d'uso meglio di qualsiasi altra soluzione) .
Tabelle separate per attributi specifici dello sport
Potresti creare un singolo players
tavolo con attributi comuni a tutti i giocatori di tutti gli sport, e quindi un altro set di tavoli come nhl_players_details
quello contiene un ID giocatore e colonne con informazioni aggiuntive sul giocatore. Se ci sono un sacco di attributi comuni, o hai molti usi di "tutti i giocatori di tutti gli sport", allora potrebbe avere senso.
Coppie chiave-valore per attributi specifici dello sport
Approccio completamente alternativa: avere un players
tavolo (di nuovo, con gli attributi comuni come nome) e poi una player_data
tabella che ha PlayerId
, Sport
, Attribute
, Value
. I nomi degli attributi immessi sarebbero specifici per lo sport. Ciò consente essenzialmente di aggiungere nuovi attributi senza modificare lo schema (il codice dovrebbe comunque sapere per caricarli / visualizzarli ovviamente). Lo svantaggio è che perdi un po 'di integrità: il valore sarebbe in genere un campo stringa, quindi il codice dell'app dovrebbe essere resiliente e gestire potenziali errori convertendo la stringa value
in un tipo di dati specifico (come intero).
Questo concetto può ovviamente applicarsi a squadre, giochi, ecc.