从嵌套 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。
所以我从 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。