如何在同一个表中正确组织历史数据?

dzjeubhm  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(361)

主要组织和问题
我在做一个 football 匹配,此数据库按以下结构组织:

Country -> Competition -> Season -> Data

问题的基本问题是,我不太确定我的数据库模式是否正确。
解释数据结构
主要的“问题”是 Data 是按特定的季节分组的,让我们考虑一下这个国家 England :

Country | Competition    | Season    |
England | Premier League | 2017/2018 |
England | Premier League | 2016/2017 |
England | Premier League | 2015/2016 |
England | Premier League | 2014/2015 |
England | Premier League | 2013/2014 |

你可以看到 England 有一个名为 Premier League 分为五个季节。
每个 competition 分为 rounds 一场比赛可以由一个人组成 round ,但也比 rounds .
每个 round 可分为 groups ,这取决于比赛的类型,有些比赛不分组。
数据库结构
根据我对数据关系的解释,我配置了一个数据库结构,它有下表:
国家:包含所有可用的国家信息。
比赛:包含所有比赛详情。
比赛季节:包含所有比赛季节。
比赛回合:包含比赛的所有回合。
竞赛组:包含所有可用于竞赛的组。
联赛排名:包含参加特定比赛的每一队的所有排名位置。
数据库架构如下(我没有足够的rep来显示您需要的图像,请单击链接):
在此处输入图像描述
数据库代码

-- -----------------------------------------------------
-- Table `mydb`.`country`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`country` (
  `id` INT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `link` VARCHAR(255) NOT NULL,
  `iso` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `mydb`.`competition`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`competition` (
  `id` INT NOT NULL,
  `country_id` INT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `link` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `id_idx` (`country_id` ASC),
  CONSTRAINT `FK_country_competition_country_id`
    FOREIGN KEY (`country_id`)
    REFERENCES `mydb`.`country` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `mydb`.`competition_seasons`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`competition_seasons` (
  `season_id` INT NOT NULL,
  `competition_id` INT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `create_at` DATETIME NULL,
  `update_at` DATETIME NULL,
  INDEX `competition_id_idx` (`competition_id` ASC),
  PRIMARY KEY (`season_id`),
  CONSTRAINT `FK_competition_competition_seasons_competition_id`
    FOREIGN KEY (`competition_id`)
    REFERENCES `mydb`.`competition` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `mydb`.`competition_groups`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`competition_groups` (
  `group_id` INT NOT NULL,
  `competition_id` INT NOT NULL,
  `round_id` INT NOT NULL,
  INDEX `group_id_idx` (`group_id` ASC),
  INDEX `competition_id_idx` (`competition_id` ASC),
  INDEX `round_id_idx` (`round_id` ASC),
  CONSTRAINT `FK_group_competition_groups_group_id`
    FOREIGN KEY (`group_id`)
    REFERENCES `mydb`.`group` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FK_competition_competition_groups_competition_id`
    FOREIGN KEY (`competition_id`)
    REFERENCES `mydb`.`competition` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FK_round_competition_groups_round_id`
    FOREIGN KEY (`round_id`)
    REFERENCES `mydb`.`round` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `mydb`.`competition_rounds`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`competition_rounds` (
  `competition_id` INT NOT NULL,
  `round_id` INT NOT NULL,
  INDEX `competition_id_idx` (`competition_id` ASC),
  INDEX `round_id_idx` (`round_id` ASC),
  CONSTRAINT `FK_competition_competition_rounds_competition_id`
    FOREIGN KEY (`competition_id`)
    REFERENCES `mydb`.`competition` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FK_round_competition_rounds_round_id`
    FOREIGN KEY (`round_id`)
    REFERENCES `mydb`.`round` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `mydb`.`league_ranking`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`league_ranking` (
  `id` INT NOT NULL,
  `position` INT NULL,
  `team_id` INT NULL,
  `season_id` INT NULL,
  `round_id` INT NULL,
  `competition_id` INT NULL,
  `group_id` INT NULL,
  `played_matches` INT NULL,
  `wins` INT NULL,
  `draws` INT NULL,
  `losses` INT NULL,
  `goals_for` INT NULL,
  `goals_against` INT NULL,
  `goals_difference` INT NULL,
  `points` INT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `FK_team_league_ranking_teamd_id`
    FOREIGN KEY (`id`)
    REFERENCES `mydb`.`team` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FK_round_league_ranking_round_id`
    FOREIGN KEY (`id`)
    REFERENCES `mydb`.`round` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FK_competition_league_ranking_competition_id`
    FOREIGN KEY (`id`)
    REFERENCES `mydb`.`competition` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FK_group_league_ranking_group_id`
    FOREIGN KEY (`id`)
    REFERENCES `mydb`.`group` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

我的数据库模式是否适用于商店历史季节?

mccptt67

mccptt671#

1. 首先,我不明白“竞赛圆桌”表的用法,这里你用两列“竞赛id”和“圆桌id”来定义这个表。无论如何,您已经在“leage\u ranking”表中定义了“competition\u id”和“round\u id”,因此,我建议不要再使用额外的表来存储相同的数据。

2. 正如您所提到的,您希望历史性地存储数据,那么我假设将有更少的事务或没有事务。所以,我建议你去规范化这个表。因为一天结束时,你要分析数据,对历史数据进行大量的数据挖掘,以提供适当的业务预期。

3. 除此之外,根据我的经验,它似乎是一个很好的数据模型。

请参阅此链接以了解数据库设计模式

ppcbkaq5

ppcbkaq52#

假设
比赛由一轮或多轮组成,
一轮可以选择由一个或多个组组成。
那么我推荐
每个“竞争”包含一行的一个表。
一个表,每个“轮”包含一行。它应该包含一个 competition_id 这是一个fk到 competition.id .
一个表,每个“组”包含一行。它应该包含一个 round_id 这是一个fk到 round.id .
(等)
这些是执行“1:多”Map的示例(注意“0或更多”和“可选”只是“1:many”的边缘情况,不需要额外的努力。)
我说“一张table”是因为“垂直分割”很少是不必要的。只需将“竞争”的所有属性放在一个表中。当某些属性(如“rounds”)重复时,就不能将其放在同一个表中。
(表名) competition_rounds ,虽然是描述性的,但让我很困惑。)
一个相关的问题。。。一场“竞赛”的所有“回合”都在一个国家进行吗?我懂了 country_idcompetition ; 我不知道是否应该把它搬到 rounds ?

相关问题