我想为比赛数据库建模以存储在线游戏的数据 我的问题是:如何在关系数据库中创建模型来存储所有类型的锦标赛? (例如英雄联盟锦标赛,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)
答案 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)
一些注意事项:
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
字段以及它们的自定义字段。在Game的元类中设置abstract = True
可以防止它作为单独的表存在于数据库中。