Пример для вопроса я возьму из документации JSON API, но это не важно т.к. те же вопросы возникнут и при работе по другим соглашениям, например GraphQL.
Предположим, мне нужно получить список статей с данными об их авторах.
Делаю запрос согласно
документации JSON API с запросом полей:
GET /articles?include=author&fields[articles]=title,body,author&fields[people]=name HTTP/1.1
Получаю ответ:
HTTP/1.1 200 OK
Content-Type: application/vnd.api+json
{
"data": [{
"type": "articles",
"id": "1",
"attributes": {
"title": "JSON API paints my bikeshed!",
"body": "The shortest article. Ever."
},
"relationships": {
"author": {
"data": {"id": "42", "type": "people"}
}
}
}],
"included": [
{
"type": "people",
"id": "42",
"attributes": {
"name": "John"
}
}
]
}
Сохраняю данные в Store на клиенте в нормализованном виде:
{
articles: {
"1": {
id: "1",
title: "JSON API paints my bikeshed!",
body: "The shortest article. Ever",
author: "42"
}
},
people: {
"42": {
name: "John"
}
}
}
Теперь я легко могу получить данные об авторе по ID и отобразить их.
Теперь, предположим, мне надо отобразить ту же статью не в списке, а детально.
Что следует сделать? Проверить, а нет ли этой статьи в Store и если нет, то запросить данные с сервера.
Статья есть - отображаем!
Но тут проблеме: на странице с детальный отображением мне нужно еще поле image, которое содержит ссылку на иллюстрирующее статью изображение и список комментариев к статье!
Это фиаско, братан! (с)
По сути само наличие в store какого-то объекта не гарантирует полноты данных в нем и тем более не гарантирует наличия связанных объектов и полноты данных в них.
Вот с этого момента вопрос: как правильно?
Самый просто вариант: не проверять данные в store и всегда запрашивать их снова, при любом обращении.
Плюсы и минусы такого подхода очевидны: плюс - можно не накапливать данные в сторе как в кэше, не занимать ими оперативку пользователя и не рисковать ее переполнением (что характерно для SPA); минус - мы постоянно делаем запросы на сервер, часто одинаковые за одними и теми же данными.
Другой вариант: проверять наличие всех полей у объекта в store, и если чего то не хватает то... тут опять есть варианты - запросить повторно все данные или запросить только недостающие. А надо еще проверить так же наличие и полноту данные в связанных (relationships) ресурсах...
В общем вариантов много, и все уже пришедшие на ум, мне не нравятся по тем или иным причинам.
Поделитесь пожалуйста лучшими практиками решения таких вопросов, своим опытом или ссылкой на чужой.