Letztendlich kommt es auf Nutzung und Architektur an.
Die Architektur
Kann das System "jeden Sport" ausführen? Ist die Idee, dass Sie Ihren Architekturastronautenhut aufsetzen und ein generisches System bauen, das für alle zukünftigen Sportarten geeignet ist, die es heute möglicherweise noch nicht gibt?
Wenn dies der Fall ist, ist das Vorhandensein dynamisch benannter Tabellen offensichtlich ein großes Problem. Daher ist es sinnvoll, ein Schema zu verwenden, das bei Bedarf n Sportarten unterstützt.
Trotzdem bin ich sehr stark gegen diesen Ansatz: Das ist fast immer mehr Arbeit und führt zu schlechteren Ergebnissen. Das Erstellen einer separaten Benutzeroberfläche, eines separaten Schemas usw. für jede Sportart führt letztendlich zu einer besseren Benutzererfahrung und einer einfacheren Pflege des Codes, auch wenn dies nur oberflächliche Doppelungen zur Folge hat (wie dies vermieden / minimiert werden kann, ist eine separate Frage).
Wie gehen Sie mit Spielern um, die mehrere Sportarten ausüben? Erhalten sie zwei Einträge (z. B. behandeln Sie sie als unterschiedliche Personen) oder versuchen Sie, mit ihnen etwas Bestimmtes zu tun?
Verwenden
Nehmen wir also an, Sie treiben keinen dynamischen Sport (wenn beispielsweise jemand eine neue Sportart hinzufügen möchte, ist Entwicklungsaufwand erforderlich, um sie hinzuzufügen).
Gibt es jemals eine Zeit, in der Sie Spieler (oder andere von Ihnen erwähnte Objekte) aus mehr als einer Sportart gleichzeitig anzeigen?
Ich könnte dies für eine Suchfunktion sehen, bei der Sie nach Spieler- oder Teamnamen suchen können (unabhängig von der Sportart), aber darüber hinaus kann ich mir viele Anwendungsfälle nicht vorstellen.
Wenn Sie dies niemals tun müssen, ist Ihr Ansatz vollkommen in Ordnung. Sie können hier aufhören zu lesen.
Alternative Schemata
Ansichten
Ich bin ein Fan von KISS. In mehr als 15 Jahren Softwareentwicklung greife ich weiterhin auf die Philosophie zurück, "das einfachste zu bauen, was funktioniert".
Meine anfängliche Reaktion auf die Annahme, dass eine sportübergreifende Suchfunktion der einzige Anwendungsfall ist, besteht darin, Ansichten zu erstellen:
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 ....
Wenn Sie eine neue Sportart hinzufügen, müssen Sie diese natürlich der Ansicht hinzufügen. Es kann auch nützlich sein, andere gebräuchliche Informationen einzuschließen, aber das hängt wirklich davon ab, was gezeigt werden muss.
Ich würde versuchen, alle sportspezifischen Inhalte in der Ansichtsdefinition zu belassen, sodass der Suchcode nicht viel oder einen bestimmten Code enthalten muss (abgesehen davon, dass Sie möglicherweise wissen, wie Sie auf /nhl/players/player-name
vs verlinken sollen, /nfl/...
oder wie Ihre App dies tut).
Tabellenvererbung
Tabellenvererbung kann funktionieren, ist aber ziemlich komplex. Ich habe nicht viel Erfahrung damit, und in der Tat denke ich, dass wir jedes Mal, wenn ich daran beteiligt war, etwas Einfacheres gemacht haben (wie ich hier vorschlage).
Ich persönlich muss noch herausfinden, warum dies nützlich ist, aber vielleicht gibt es einen überzeugenden Anwendungsfall (den ich nicht kenne), der die Komplexität rechtfertigt (z. B. löst die Tabellenvererbung den Anwendungsfall besser als jede andere Lösung). .
Separate Tabellen für sportspezifische Attribute
Sie könnten eine einzelne players
Tabelle nhl_players_details
erstellen, deren Attribute allen Spielern aller Sportarten gemeinsam sind, und dann eine andere Gruppe von Tabellen , die eine Spieler-ID und Spalten mit zusätzlichen Informationen zum Spieler enthält. Wenn es eine Menge gemeinsamer Attribute gibt oder Sie "alle Spieler aus allen Sportarten" vielfach einsetzen können, ist dies möglicherweise sinnvoll.
Schlüsselwertpaare für sportspezifische Attribute
Völlig alternativer Ansatz: eine hat players
Tabelle (wieder mit gemeinsamen Attributen wie Name) und dann eine , player_data
die Tabelle hat PlayerId
, Sport
, Attribute
, Value
. Die eingegebenen Attributnamen wären sportspezifisch. Auf diese Weise können Sie im Wesentlichen neue Attribute hinzufügen, ohne das Schema zu ändern (Ihr Code müsste immer noch wissen, um sie zu laden / anzuzeigen). Der Nachteil ist, dass Sie etwas an Integrität verlieren: Der Wert ist normalerweise ein Zeichenfolgenfeld, sodass der Anwendungscode stabil sein und potenzielle Fehler bei der Konvertierung der Zeichenfolge value
in einen bestimmten Datentyp (z. B. eine Ganzzahl) behandeln muss.
Dieses Konzept kann natürlich für Teams, Spiele usw. gelten.