title: When to use Apollo's cacheRedirects?
body: <p>The Apollo documentation <a href="https://www.apollographql.com/docs/react/advanced/caching.html#cacheRedirect" rel="noreferrer">discusses the use of <code>cacheRedirects</code></a> to tell Apollo how to access data that's already in the cache from other query.</p>
  
  <p>It gives an example of this:</p>
  
  <blockquote>
    <p>In some cases, a query requests data that already exists in the client
    store under a different key. A very common example of this is when
    your UI has a list view and a detail view that both use the same data.
    The list view might run the following query:</p>
    
    <p>query ListView {   books {
        id
        title
        abstract   } }</p>
    
    <p>When a specific book is selected, the detail view displays an
    individual item using this query:</p>
    
    <p>query DetailView {   book(id: $id) {
        id
        title
        abstract   } }</p>
    
    <p>We know that the data is most likely already in the client cache, but
    because it’s requested with a different query, Apollo Client doesn’t
    know that. In order to tell Apollo Client where to look for the data,
    we can define custom resolvers</p>
  </blockquote>
  
  <p>I'm trying to understand <em>why</em> this is necessary for this example. If the <code>books</code> query returns an array of type <code>Book</code>, and the <code>book</code> request returns a single object of type <code>Book</code>, then surely the normalised cache will already have data for each of the books (from the ListView query) based on the typename and id, and the <code>DetailView</code> query can use that information directly without any further intervention. Instead, we're told for write some code to help it:</p>
  
  <pre><code>const cache = new InMemoryCache({
    cacheRedirects: {
      Query: {
        book: (_, args, { getCacheKey }) =&gt;
          getCacheKey({ __typename: 'Book', id: args.id })
      },
    },
  });
  </code></pre>
  
  <p>Underwhat exactly which circumstance is the ApolloClient not able to figure this out for itself, and why?</p>