Можно ли просто создать уникальную таблицу для хранения статей, возвращаемых API, когда пользователи ее запрашивают?
Да. Если статьи имеют уникальные ключи (doi?), Вы можете использовать INSERT ... ON CONFLICT. НИЧЕГО не обрабатывайте (предположительно очень редко), когда статья запрашивается двумя людьми почти одновременно.
Должен ли я хранить статьи, возвращаемые API, и связывать каждую из них с пользователем, который его запросил (модель Article будет содержать сопоставление внешнего ключа с моделью User)?
Хотите ли вы ? Есть ли причина для этого? Вас волнует, кто запрашивал каждую статью? Похоже, вы ожидаете сохранить только первый человек, который запрашивает каждую статью, а не каждый запрос?
Или я должен дать каждому пользователю таблицу (изоляция данных была бы хорошей, но это звучит очень неэффективно)?
Правильно, вы будете использовать API гораздо чаще (при условии, что некоторая большая часть статей запрашивается более одного раза) и сохраните много дубликатов. Это может даже не решить проблему, если один человек дважды нажимает кнопку «отправить», или если открыто несколько вкладок, или пишет бота для параллельного доступа к вашему сервису.