Как организовать хранение данных в БД?
1) я бы помимо ID хранил еще порядковый номер, который бы четко задавал последовательность изображений. В таком случае мы можем хранить рэйнджи не просмотренных изображений. Ну и так как у нас может быть произведен переход только к соседнему изображению - это легко устроить.
2) без разницы. Лучше по дефолту брать sql и nosql для кеширования и агрегации данных в случае необходимости.
Уточните, prev/next выдаёт случайный id или соседний? Если соседний, то выходит так, что все изображения которые просмотрел пользователь, формируют диапазон id. 
Если так, то для каждого пользователя, надо хранить min/max id изображения, которое он уже посмотрел, а также его текущую позицию. 
В реляционной базе была бы такая таблица: 
user id, min_image_id, max_image_id, current_image_id
Тогда, когда пользователь кликает prev/next надо в таблице изображений находить изображение, следующее за текущим, и обновлять состояние пользователя. 
В целом, можно хранить и все изображения, которые просмотрел пользователь, сути это не изменит, просто потребуется больше места. 
Сделать такую штуку можно на чём угодно, могу рассказать как сделать на Тарантуле.