web-dev-qa-db-fra.com

Meilleur moyen de concevoir la base de données du tournoi

Je crée une page Web permettant de placer des paris sur tous les matchs du prochain tournoi de football Euro 2012. Besoin d'aide pour décider de la approche de prendre pour la phase Knockout.

J'ai créé une maquette ci-dessous, que je suis plutôt satisfaite de la conservation des résultats de tous les matchs de phase de groupe "connus". Cette conception facilite la vérification si un utilisateur a placé un pari correct ou non.

Mais quelle est la meilleure façon de stocker le trimestre et les demi-finales? Ces correspondances dépendent du résultat de la phase de groupe.

Une approche que j'ai pensée, ajoutait toutes les correspondances à la table matches, mais attribuez différentes variables ou identificateurs aux équipes d'accueil/absence pour les matchs de la phase Knockout. Et ensuite avoir une autre table avec ces identifiants mappés aux équipes ... cela pourrait fonctionner, mais ne se sent pas bien.

Basic database design

13
hampusohlsson

Je commencerais par essayer de réparer tous les informations prédéterminées dans le modèle lui-même, y compris

  • dates/Lieux
  • structure (c.-à-d. Étapes du groupe/Knockout)
  • règles (c.-à-d. points de notation, règles de raccordement)

Certaines de ces informations seront des données dans des tables, certaines seront codifiées logiques dans des vues.

Quelque chose comme ça peut-être:

  • équipe (Team_id, Group_code Enum ('A', 'B', 'C', 'D'), NOM)
  • match (match_id, kickoff_at)
  • group_match (match_id, Team_id_Home, Team_id_away, Group_Code)
  • knockout_match (match_id, knockout_code Enum ('Q1', 'Q2', 'Q3', 'Q4', 'S1', 'S2', 'F')
  • résultat (match_id, score_home, score_away)

Des informations telles que les équipes jouent au Q1 n'ont jamais besoin d'être stockées directement car elles peuvent être calculées à partir des résultats de la phase de groupe. Les modifications seulement changent à mesure que le tournoi progresse les insertions dans la table result.

Je pense que l'utilisation de l'identifiant de l'équipe est la bonne façon d'y aller. Un autre niveau d'abstraction pour toutes les rondes de finales ajoute simplement une complexité inutile pour pas beaucoup d'avantage autre que de pré-charger la table des correspondances avec des données.

La structure de données a l'air assez solide pour le soutenir. Le quart et les semi-finaux devraient être ajoutés à la table des matchs une fois que les résultats des match initiaux sont allés. Si les correspondances sont attribuées au hasard, il s'agit d'une opération manuelle, cependant, si elles sont dans un ordre particulier ...

   A
match 1 -----+
   B         A
          match 5 -----+
   C         C         |
match 2 -----+         |
   D                   A
                    match 7
   E                   F
match 3 -----+         |
   F         F         |
          match 6 -----+
   G         G
match 4 -----+
   H

... alors cela pourrait éventuellement être fait avec une requête. Encore une fois, la complexité de la requête peut ne pas valoir l'effort en fonction du nombre d'équipes

3
Tevo D