Что такое статистика футбольных матчей Логика модели Django?

Я создаю приложение, которое визуализирует статистику футбольных матчей на Django. Я беру данные из https://fbref.com/ в виде CSV файла. У меня есть скрипт python, который очищает данные и создает фрейм данных с ['Player', 'Shots', 'SCA', 'Touches', 'Pass', 'Carries', 'Press', 'Tackled', 'Interceptions', 'Blocks'] столбцами (я могу добавить название команды, дату игры, Home/Away или что-то еще). Теперь мне нужно создать модели для хранения этих данных. Я не знаю, какие модели мне нужны.

Вариант 1 (только одна модель):

class GameStats(models.Model):
date = models.DateField()
team_name = models.CharField(max_length=20)
home_away = models.CharField(max_length=20, choices=HOME_AWAY)
name = models.CharField(max_length=20)
number = models.IntegerField()
age = models.IntegerField()
shots = models.IntegerField()
SCA = models.IntegerField()
touches = models.IntegerField()
passes = models.IntegerField()

Но это даст одну строку данных. Технически я могу группировать строки по имени_команды и дате.

Вариант 2:

from django.db import models


class Team(models.Model):
  name = models.CharField(max_length=200)
  league = models.CharField(max_length=200)

def __str__(self):
    return self.name

class Player(models.Model):
  name = models.CharField(max_length=200)
  number = models.IntegerField()
  age = models.IntegerField()
  team = models.ForeignKey(Team, related_name='team', on_delete=models.CASCADE)

  def __str__(self):
    return self.name

class HomeTeam(models.Model):
  team = models.ForeignKey(Team, related_name='home_team', on_delete=models.CASCADE)
  players = models.ManyToManyField(Player)
  def __str__(self):
    return self.team

class AwayTeam(models.Model):
  team = models.ForeignKey(Team, related_name='away_team', on_delete=models.CASCADE)
  players = models.ManyToManyField(Player)
  def __str__(self):
    return self.team

class Game(models.Model):
  title = models.CharField(max_length=200)
  homeTeam = models.OneToOneField(HomeTeam, on_delete=models.CASCADE)
  awayTeam = models.OneToOneField(AwayTeam, on_delete=models.CASCADE)

def __str__(self):
    return self.title

В варианте 2 я могу понять, куда поместить статистику игры и список игроков.

Было бы здорово, если бы кто-нибудь написал нормальные модели. Я действительно складываю!

Не существует единого способа сделать это, поэтому каждый ответ, который вы получите на этот вопрос, будет иметь свое мнение. Учитывая это, лично я бы предпочел первый модальный подход, поскольку он прост и содержит все данные в одном месте. Я не вижу смысла разделять столбцы по разным таблицам базы данных, если только вы не знаете, что эти разные подмножества столбцов будут использоваться в других моделях позже. Даже тогда вы всегда можете связать всю модель с помощью ForeignKey с новой моделью и использовать только те данные, которые вам нужны.

Еще одна причина, по которой я предпочитаю первый подход, заключается в том, что данные не имеют большого количества столбцов, поэтому делить их на множество мелких частей - значит усложнять их без причины. При втором подходе вы будете чаще обращаться к базе данных, и в дальнейшем вам будет трудно следить за всем. Но это мое мнение, поэтому примите его с долей соли.

Вернуться на верх