从嵌套 JSON 创建关系数据库

Create a relational database from a nested JSON

所以我从 Riot 中提取了 大量 数据,因为我想获取游戏信息和 parse/do 数据分析,并且还能够将其提取到一个网站,所以我选择使用 PostgreSQL,但我在 tables.

的结构上遇到了很多麻烦

下面是我从这个 API

中提取的嵌套 JSON 的示例

我 运行 最重要的是我对数据库总体上还是个新手,我不太擅长理解这些概念,我一直在浏览在线教程,但我只是我似乎无法理解外键。

如果我有一个嵌套的 JSON 通过 game_id 被识别为一个特定的游戏实例,比方说,

{ 
    game_id: 123456
    ...
}

并且有多个嵌套组件也有我想单独存储在其他 table 中的键。

比如说,

{
    game_id: 123456
    ...
    {
        team_id: 123456
        ...
            {
                participant_id: 123456
                ...
            }
     }
}

然后每个游戏 table、团队 table 和参与者 table 都应该有一个外键,这样游戏 table 就有一个团队的外键 table,团队 table 有参与者 table?

的外键

例如:

CREATE TABLE games (
    game_id SERIAL PRIMARY KEY,
    team_id SERIAL REFERENCES game_teams(team_id),
    ...
    )

CREATE TABLE game_teams(
    team_id SERIAL PRIMARY KEY,
    participant_id SERIAL REFERENCES game_participants(participant_id),
    ...
    )

CREATE TABLE game_participants(
    participant_id INTEGER PRIMARY KEY,
    stats_id SERIAL REFERENCES game_participants_stats(stats_id),
    ...
    )

我认为您的困惑源于您试图使用您收集的 json 数据构建 RDB,而您看到的是结果而不是过程。 RDB 中的关系有一对一、一对多和多对多,称为'Cardinality'。一场比赛可以包含多支球队,但一支球队只能引用所属的一场比赛。团队的参与者也是如此。

CREATE TABLE games (
    game_id Integer PRIMARY KEY,
    platformId Integer,
    gamecreation DateTime,
    ...
    )

由于基数是多支球队的一场比赛,您可以通过参考球队 table 中的比赛来建模这种关系,然后参考参与者 table 中的球队:

CREATE TABLE teams (
    team_id Integer PRIMARY KEY,
    game_id Integer References games(game_id),
    win Bool,
    ...
    )
CREATE TABLE pariticpants (
    participant_id Integer PRIMARY KEY,
    team_id Integer References teams(team_id),
    ...
    )

现在,每当您从您的游戏 table 查询游戏行时,添加类似 Select team_id from Teams Join Games on Teams.game_id = Games.game_id 的内容,查询现在包含有关每个团队及其所属游戏的信息。您引用另一个 table 的方式完全取决于基数,因此最好创建实体关系图来帮助您导航 table。