Meilleure façon de concevoir une base de données de tournois

13

Je crée une page Web pour placer des paris sur tous les matchs du prochain tournoi de football Euro 2012. Besoin d'aide pour décider de l'approche à adopter pour la phase à élimination directe.

J'ai créé une maquette ci-dessous, dont je suis assez satisfait quand il s'agit de stocker les résultats de tous les matchs de phase de groupes "connus". Cette conception permet de vérifier très facilement si un utilisateur a placé une mise correcte ou non.

Mais quelle est la meilleure façon de stocker les quarts et demi-finales? Ces matchs dépendent du résultat de la phase de groupes.

Une approche à laquelle j'ai pensé consistait à ajouter TOUTES les correspondances au matchestableau, mais attribuer différentes variables ou identifiants aux équipes à domicile / à l'extérieur pour les matches de la phase à élimination directe. Et puis avoir une autre table avec ces identifiants mappés aux équipes ... Cela pourrait fonctionner, mais ne semble pas correct.

Conception de base de données de base

hampusohlsson
la source
Êtes-vous décidé à utiliser MySQL ou ouvert à des alternatives?
Jack dit d'essayer topanswers.xyz
Assez bien réglé. Y a-t-il des avantages / inconvénients avec MySQL dont je devrais être conscient?
hampusohlsson
Les contraintes de vérification ne sont pas appliquées. En général, moins d'options pour appliquer les contraintes avec DRI - mais cela dépend de votre application. Heureux de discuter si vous voulez plus d'opinion :)
Jack dit d'essayer topanswers.xyz
Merci, mais je ne pense pas que j'aurais de toute façon utilisé des contraintes car je ne le connais pas très bien. Validera toutes les données de ma candidature avant qu'elle ne soit envoyée à la base de données, en toute simplicité
hampusohlsson
Bien bien. C'est plus simple dans la base de données bien sûr, mais c'est une toute autre conversation ;)
Jack dit d'essayer topanswers.xyz

Réponses:

3

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

  • dates / lieux
  • structure (c.-à-d. groupes / phases éliminatoires)
  • règles (c.-à-d. notation des points, règles du bris d'égalité)

Certaines de ces informations seront des données dans des tableaux, d'autres seront de la logique codifiée dans des vues.

Quelque chose comme ça peut-être:

  • team (team_id, group_code enum ('A', 'B', 'C', 'D'), name)
  • 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)

Les informations telles que les équipes jouent au T1 n'ont jamais besoin d'être stockées directement car elles peuvent être calculées à partir des résultats de la phase de groupes. Les seuls changements à apporter au fur et à mesure que le tournoi progresse sont des insertions dans le resulttableau.

Jack dit d'essayer topanswers.xyz
la source
3

Je pense que l'utilisation de l'ID d'équipe est la bonne solution. Un autre niveau d'abstraction pour toutes les phases finales ajoute simplement une complexité inutile pour pas beaucoup d'avantages autres que le préchargement du tableau des correspondances avec des données.

La structure des données semble assez solide pour supporter cela. Les quarts et les demi-finales devraient être ajoutés à la table des matches une fois que les résultats de match initiaux sont entrés.

   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 ne vaut peut-être pas la peine selon le nombre d'équipes

Tevo D
la source
1

C'est une bonne idée de stocker toutes les correspondances dans le tableau "correspondances". Cependant, j'ajouterais un champ supplémentaire "classement", car plus tard, vous en aurez besoin pour construire un arbre binaire pour interroger efficacement la table en mémoire. C'est un problème d'algorithme de classement classique et vous pouvez google pour le tournoi de code gris pour plus d'informations ou consulter mon historique de stackoverflow. Fondamentalement, un tournoi est un arbre binaire. Voici un bon article sur les codes gris: http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . Malheureusement c'est français. Voici comment générer un arbre binaire à partir du classement: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068 .

Gigamegs
la source