如何在Django中将锦标赛数据库建模为SQL

时间:2019-07-04 12:58:20

标签: sql django django-models

我想为比赛数据库建模以存储在线游戏的数据 我的问题是:如何在关系数据库中创建模型来存储所有类型的锦标赛? (例如英雄联盟锦标赛,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 个答案:

答案 0 :(得分:1)

您可以在[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.countryCharField),但最好将ForeingKey字段用于单独的模型。

这还假设您不需要为不同类型的锦标赛(英雄联盟,DOTA)使用不同的字段。如果确实需要此功能,则可以使用继承自abstract base class的不同模型来实现:

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)

在此示例中,DOTA2GameLeagueOfLegendsGame都继承自Game,因此具有namematch字段以及它们的自定义字段。在Game的元类中设置abstract = True可以防止它作为单独的表存在于数据库中。