Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在API可访问的PostgreSQL表中归档大型JSON对象的正确方法?_Postgresql - Fatal编程技术网

在API可访问的PostgreSQL表中归档大型JSON对象的正确方法?

在API可访问的PostgreSQL表中归档大型JSON对象的正确方法?,postgresql,Postgresql,我研究这个问题已经有一段时间了。我在一个统计网站上工作,作为我玩游戏的爱好 基本上,我有一个脚本,每5分钟访问一次游戏的API(可能会增加到15分钟),并一次提取所有比赛的当前状态。我最初将此对象存储为表中的JSON列。(然后每行的JSON列中都有一个118kb的对象) 问题是试图查询表以获取一周内的整个存档(即匹配的持续时间)。基本上,当我只想从JSON中拿出一个特定的键时,它正在为一周的匹配提取2016个118kb的记录。对该API端点的请求大约需要10秒才能完成 我在PostgreSQL中

我研究这个问题已经有一段时间了。我在一个统计网站上工作,作为我玩游戏的爱好

基本上,我有一个脚本,每5分钟访问一次游戏的API(可能会增加到15分钟),并一次提取所有比赛的当前状态。我最初将此对象存储为表中的JSON列。(然后每行的JSON列中都有一个118kb的对象)

问题是试图查询表以获取一周内的整个存档(即匹配的持续时间)。基本上,当我只想从JSON中拿出一个特定的键时,它正在为一周的匹配提取2016个118kb的记录。对该API端点的请求大约需要10秒才能完成

我在PostgreSQL中只找到了基于JSON键查询行的方法,但没有找到类似于
SELECT match.kills FROM matches WHERE…
的方法

我意识到这是行不通的,所以我想尝试从JSON对象中获取键,并将它们插入相应的表列中

JSON对象框架如下所示:

所以我想将其存储在我的数据库中,并将键作为列,但我不太确定如何为具有
object
类型值的键实现它

最终目标是以一种可以通过URL访问的API的方式来存储它,例如:

mywebsite.com/api/v1/matcharchive?数据=死亡,得分和匹配ID=1-1和存档时间=2016-07-09T02:00:00Z

它将在数据库中只查询对象中的这3个键并返回它们


将具有这么多键的JSON对象存储到PSQL表中的正确方法是什么?

您只需要在JSON字段上使用
->
操作符。此示例经过轻微编辑,因此“自动增量”关键点略为关闭

host=# create table tmp1 ( id serial primary key, data json);
CREATE TABLE
host=# \d tmp1
                         Table "public.tmp1"
 Column |  Type   |                     Modifiers
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('tmp1_id_seq'::regclass)
 data   | json    | 
Indexes:
    "tmp1_pkey" PRIMARY KEY, btree (id)

host=# insert into tmp1 (data) values ('{"a":1, "b":2}'), ('{"a":3, "b":4}'), ('{"a":5, "c":6}');
INSERT 0 3
host=# select * from tmp1;
 id |      data      
----+----------------
  2 | {"a":1, "b":2}
  3 | {"a":3, "b":4}
  4 | {"a":5, "c":6}
(3 rows)   

host=# select id, data->'b' from tmp1;
 id | ?column?
----+----------
  2 | 2
  3 | 4
  4 |
(3 rows)

您只需要在json字段上使用
->
操作符。此示例经过轻微编辑,因此“自动增量”关键点略为关闭

host=# create table tmp1 ( id serial primary key, data json);
CREATE TABLE
host=# \d tmp1
                         Table "public.tmp1"
 Column |  Type   |                     Modifiers
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('tmp1_id_seq'::regclass)
 data   | json    | 
Indexes:
    "tmp1_pkey" PRIMARY KEY, btree (id)

host=# insert into tmp1 (data) values ('{"a":1, "b":2}'), ('{"a":3, "b":4}'), ('{"a":5, "c":6}');
INSERT 0 3
host=# select * from tmp1;
 id |      data      
----+----------------
  2 | {"a":1, "b":2}
  3 | {"a":3, "b":4}
  4 | {"a":5, "c":6}
(3 rows)   

host=# select id, data->'b' from tmp1;
 id | ?column?
----+----------
  2 | 2
  3 | 4
  4 |
(3 rows)

如果数据结构如示例中所示,那么JSON不是一个好的选择。相反,请选择普通规范化。@Clodoaldo Neto对不起,我不知道你的意思。从google搜索来看,您似乎在谈论为不同部分使用多个表,例如地图表、目标表等?是的,搜索数据库规范化。如果数据结构如示例中所示,那么JSON不是一个好的选择。相反,请选择普通规范化。@Clodoaldo Neto对不起,我不知道你的意思。在谷歌搜索中,你似乎在谈论为不同部分创建多个表,例如地图表、目标表等?是的,搜索数据库规范化。哦!非常感谢。我环顾四周时没有看到这样的东西。我想这会解决我的问题。当我明天有机会进一步测试这个问题时,我会将这个问题标记为已回答。我在谷歌上搜索了“postgresql json操作符”,得到了这个手册页面:。还有其他json值的访问器。看起来这将非常适合我的需要。将问题标记为已回答。再次感谢!使用
jsonb
字段而不是
json
,这也是一个好主意,因为它几乎完全相同,只是对于这类事情来说更小更快。它可能会将键值对象按不同的顺序排列,但不会对数组进行重新排序。好的,我已经将表列更改为jsonb,并在前后使用
EXPLAIN ANALYZE
对其进行了测试,平均而言,它似乎速度更快。谢谢你!哦非常感谢。我环顾四周时没有看到这样的东西。我想这会解决我的问题。当我明天有机会进一步测试这个问题时,我会将这个问题标记为已回答。我在谷歌上搜索了“postgresql json操作符”,得到了这个手册页面:。还有其他json值的访问器。看起来这将非常适合我的需要。将问题标记为已回答。再次感谢!使用
jsonb
字段而不是
json
,这也是一个好主意,因为它几乎完全相同,只是对于这类事情来说更小更快。它可能会将键值对象按不同的顺序排列,但不会对数组进行重新排序。好的,我已经将表列更改为jsonb,并在前后使用
EXPLAIN ANALYZE
对其进行了测试,平均而言,它似乎速度更快。谢谢你!