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.
Sie sprechen von der Normalisierung der Datenbank . Möglicherweise sind Sie erleichtert, wenn Sie feststellen, dass es kein perfektes Datenmodell gibt und dass eine stärkere Normalisierung nicht immer besser ist. Durch die Normalisierung können Kosten in Bezug auf die Klarheit des Datenmodells und die Datenbankleistung entstehen. Aus diesem Grund hängt die Auswahl des besten Modells von Ihren Verwendungsanforderungen ab.
Auf den ersten Blick scheinen Ihre Beispiele im Konzept ähnlich genug zu sein (X_Game vs Y_Game und X_Team vs Y_Team), dass der zusätzliche Aufwand einiger Spalten nicht unangemessen erscheint. Das heißt, wenn jede Sportart mehrere Dutzend zusätzliche Spalten in die Tabelle aufnehmen würde, wäre dies in der Tat unhandlich.
In diesem Fall möchten Sie möglicherweise ein Hybridmodell in Betracht ziehen, bei dem die gemeinsamen Daten in einer zentralen Tabelle, die sportspezifischen Daten jedoch in einer verknüpften Datenstruktur gespeichert sind. Etwas wie:
quelle