Как сериализовать сохраненную сериализацию JSON (в Ruby / Rails)? - PullRequest
0 голосов
/ 08 ноября 2018

Я хотел бы сохранить BLOB-объект JSON в моей таблице (Postgres). Таблицу нужно часто читать. После того, как мое приложение читает таблицу, оно возвращает JSON-сериализацию этого большого двоичного объекта вместе с другими атрибутами этой таблицы клиенту.

# To illustrate, imagine an object like this
{
  name: 'foo',
  blob: {...} # this is blob that needs to be stored
}

и когда клиент запрашивает это, я хотел бы вернуть JSON-ответ, например

{"name": "foo", "blob": [...]}

При наличии базы данных Postgres очевидным выбором является хранение большого двоичного объекта в столбце json / jsonb. Но как насчет текстового столбца? Предполагая, что BLOB-объект не используется приложением, хранение сериализованной строки в текстовом столбце означает, что серверу не нужно десериализовывать BLOB-объект, а затем сериализовать обратно в JSON всякий раз, когда клиент отправляет запрос. Другими словами, сервер может просто рассматривать большой двоичный объект как строку. Звучит более эффективно, верно?

Однако, поскольку blob теперь обрабатывается как строка, полученная сериализация становится

{"name": "foo", "blob": "[...]"} # note the extra " around the array brackets

Это приводит к неправильному синтаксическому анализу в клиентском приложении, поскольку теперь blob анализируется как строка, а не как массив.

Так что мой вопрос

а. Правильно ли я считаю, что текстовый столбец будет более эффективным, чем jsonb (если эта проблема решена)?

б. если так, есть ли способ вернуть уже сериализованный объект JSON, не рассматривая его как строку? Если нет, то каков наилучший способ избежать такого типа десериализации, а затем немедленной сериализации отходов?

1 Ответ

0 голосов
/ 08 ноября 2018

Не волнуйся так сильно.

Когда вы используете столбцы JSON / JSONB в Rails, драйвер обрабатывает сериализацию / десериализацию JSON. Все, что вам нужно сделать, это объявить столбец как JSON / JSONB.

Хранение JSON / YAML любого другого формата в столбце text / varchar вряд ли даст сколько-нибудь заметный прирост производительности, НО не позволит вам правильно запросить столбец. Это то, что мы делали в темные дни до того, как у нас были собственные столбцы JSON / JSONB / HStore.

Это также возлагает бремя маршаллинга / демаршаллинга в ваших моделях - вздутие их и отказ от использования более оптимизированного кода драйвера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...