sql - 如何在 django 中将锦标赛数据库建模为 SQL

标签 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)

最佳答案

您可以在 [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_gamePlayer.country )我使用了 CharField但最好使用 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因此都有 name和一个 match字段及其自定义字段。设置abstract = True Game 的元类中阻止它作为数据库中的单独表存在。

关于sql - 如何在 django 中将锦标赛数据库建模为 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56888493/

相关文章:

mysql - 如何在Django的Model中让id自动增加2?

python - 在 Django 中实现 "teams"的模型

sql - 如何在 IF 语句以及 BEGIN..END block 中使用 @@ROWCOUNT?

mysql - 按月和年创建sql表

Amazon ELB 的 Django ALLOWED_HOSTS

javascript - 如何在 Django 中使用 css 和 javascript 的静态文件夹?

Django Admin list_filter 和带注释字段的排序

mysql - 从 SQL 表中删除与其他表内有连接的条目

mysql - Tab '–' 附近的语法错误

python - Django 迁移 : django. db.utils.OperationalError : (1824, "Failed to open the referenced table ' classroom_user'")