我想建立一个锦标赛数据库来存储在线游戏的数据 我的问题是:如何在关系数据库中创建模型来存储所有此类比赛? (例如英雄联盟锦标赛、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_game
、Player.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)
在此示例中DOTA2Game
和LeagueOfLegendsGame
两者都继承自 Game
因此都有 name
和一个 match
字段及其自定义字段。设置abstract = True
Game 的元类中阻止它作为数据库中的单独表存在。
关于sql - 如何在 django 中将锦标赛数据库建模为 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56888493/