Надлежащий способ архивировать большие объекты JSON в таблице PostgreSQL, которая будет доступна API?

postgresql

1036 просмотра

1 ответ

20 Репутация автора

Я немного поработал над этой проблемой. Я работаю над сайтом статистики как хобби для игры, в которую я играю.

По сути, у меня есть скрипт, который обращается к API игры каждые 5 минут (вероятно, увеличит это значение до 15 минут) и извлекает текущее состояние всех матчей одновременно. Первоначально я сохранял этот объект в виде столбца JSON в моей таблице. (В каждой строке в столбце JSON был объект размером 118 КБ)

Проблема была в том, чтобы попытаться выполнить запрос к таблице, чтобы получить весь архив за период в одну неделю (то есть продолжительность матча). По сути, это было извлечение 118-килобайтных записей 2016 года в течение недельного матча, когда все, что я хотел, это конкретный ключ из JSON. Запросы к этой конечной точке API занимают около 10 секунд!

В PostgreSQL я нашел только способы запроса строки, основанной на ключе JSON, но не способ сделать что-то подобное SELECT match.kills FROM matches WHERE....

Я понял, что это не сработает, поэтому я хочу попробовать взять ключи от объектов JSON и вставить их в соответствующий столбец таблицы.

Скелет объекта JSON выглядит следующим образом:

{
  id: string,
  start_time: timestamp,
  end_time: timestamp,
  scores: {
    green: number,
    blue: number,
    red: number 
  },
  worlds: number[],
  all_worlds: number[][],
  deaths: {
    green: number,
    blue: number,
    red: number
  },
  kills: {
    green: number,
    blue: number,
    red: number
  },
  maps: [
    {
      id: number,
      type: string,
      scores: same as above,
      bonuses: {
        type: string,
        owner: string
      },
      deaths: same as above,
      kills: same as above,
      objectives: [
        {
          id: string,
          type: string,
          owner: string,
          last_flipped: timestamp,
          claimed_by: guild id (put this into another api endpoint),
          claimed_at: timestamp
        },
        ... (repeat 17 times)
      ]
    },
    ... (repeat 3 times)
  ]
}

Поэтому я хочу сохранить это в своей базе данных с ключами в виде столбцов, но я не совсем уверен, как это сделать для ключей со значениями типа object.

Конечная цель - сохранить это таким образом, чтобы у меня был API, доступный по URL, например:

mywebsite.com/api/v1/matcharchive?data=kills,deaths,score&matchid=1-1&archive_time=2016-07-09T02:00:00Z

и он запросит в базе данных только эти 3 ключа в объекте и вернет их.

Как правильно сохранить объект JSON с таким количеством ключей в таблице PSQL?

Автор: Alex D Источник Размещён: 18.07.2016 08:12

Ответы (1)


0 плюса

3607 Репутация автора

Решение

Вам просто нужно использовать ->оператор на поле 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)
Автор: NovaDenizen Размещён: 18.07.2016 08:45
Вопросы из категории :
32x32