У меня есть ситуация, когда я иногда хочу запросить список многих объектов с несколькими полями, а иногда только один объект со многими полями.В качестве примера рассмотрим эти два запроса:
Запрос с большим количеством объектов и несколькими полями:
query {
object(many=true) {
id
name
}
}
Запрос содин объект и много полей:
query {
object(many=false) {
id
... (many other fields)
}
}
Я не хочу запрашивать больше полей, чем необходимо в первом запросе, потому что это приведет к запросам с большим количеством данных (в противном случае я мог бы сделать поля идентичными, например, используя fragment
, решая мою проблему).
Проблема заключается в следующем: данные, хранящиеся в кэше, нормализуются и хранятся в соответствии с __typename
и id
,Это означает, что запросы или атомы запросов будут перезаписывать друг друга, если они совпадают.Поэтому, если второй запрос выполняется последним, элемент в базе данных не имеет поля name
, которое требуется компонентам, связанным с первым запросом.
Самое простое решение - просто запросить name
во второмзапрос также.Проблема в том, что это кажется хрупким и подверженным ошибкам;Например, можно создать третий запрос и забыть спросить name
.
Другой вариант - сделать так, чтобы они имели разные __typename
, то есть дифференцировать их на бэкэнде.Но это кажется искусственным;запросы на самом деле имеют дело с объектами одного и того же типа.
Есть ли канонический способ решения этой проблемы?