Как смоделировать базу данных турниров в SQL в Django - PullRequest
0 голосов
/ 04 июля 2019

Я хочу смоделировать базу данных турниров для хранения данных онлайн-игр. Мой вопрос: Как создать модель в базе данных Relationship для хранения всех типов турниров?(например, турнир Лиги Легенд, турнир по Dota 2). Например, в турнире может участвовать 8 или 5 команд.

Это скетч, который я создал в своем уме.Какие вещи вы предлагаете (особенно мне нужна помощь в отношениях таблиц).Также, как сохранить команду 1 и команду 2 в таблице матчей (например, очки, победитель, проигравший)

подумал я;База данных игр

game_id,name

База данных игроков

player_id,name,surname,country,Game(FK).. ( and some other fields)

База команд

team_id,name,country,game,Player(ManyToMany).. ( and some other fields)

База матчей

match_id,name,match_game,match_map,team1,team2,winner,loser,date,duration,score1,score2.. ( and some other fields)

База турниров

tournament_id,tournament_name,tournament_game,Match(ManyToMany).. ( and some other fields)

1 Ответ

1 голос
/ 05 июля 2019

Вы можете создать что-то подобное в [app_name]/models.py

from django.db import models


class Tournament(models.Model):
    name = models.CharField(max_length=255)


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


class Player(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    country = models.CharField(max_length=255)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)


class Match(models.Model):
    name = models.CharField(max_length=255)
    match_game = models.CharField(max_length=255)
    match_map = models.CharField(max_length=255)
    match_teams = models.ManyToManyField(Team)
    winner = models.ForeignKey(Team, on_delete=models.CASCADE)
    loser = models.ForeignKey(Team, on_delete=models.CASCADE)
    duration = models.DurationField()
    winning_score = models.PositiveIntegerField()
    losing_score = models.PositiveIntegerField()
    tournament = models.ForeignKey(Tournament, on_delete=models.CASCADE)


class Game(models.Model):
    name = models.CharField(max_length=255)
    match = models.ForeignKey(Match, on_delete=models.CASCADE)

Некоторые вещи на заметку:

  • Вам не нужно создавать поля ID, Django сделает это автоматически.
  • Поле «многие ко многим» часто можно заменить на поле «один к одному» в другой модели, например, вместо множества матчей, имеющих много игр, каждая игра является частью одного матча. Это может или не может работать в вашем конкретном случае использования.
  • Я изменил некоторые имена полей (например, заменяя score_1 на winning_score), потому что я чувствую, что они более понятны, если предположить, что я правильно понял их цель.
  • Есть несколько полей (Tournament.tournament_game, Player.country), для которых я использовал CharField, но лучше было бы использовать поле ForeingKey для отдельной модели.

Это также предполагает, что вам не нужны разные поля для разных типов турниров (League of Legends, DOTA). Если вам это нужно, вы можете достичь этого с помощью различных моделей, которые наследуются от абстрактного базового класса :

class Game(models.Model):
    name = models.CharField(max_length=255)
    match = models.ForeignKey(Match, on_delete=models.CASCADE)

    class Meta:
        abstract = True


class DOTA2Game(Game):
    dota_field = models.CharField(max_length=255)


class LeagueOfLegendsGame(Game):
    lol_field = models.CharField(max_length=255)

В этом примере DOTA2Game и LeagueOfLegendsGame оба наследуются от Game и поэтому имеют поля name и match, а также свои пользовательские поля. Установка abstract = True в метаклассе Game предотвращает его существование в качестве отдельной таблицы в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...