То, что предложил Matt H - хорошая идея, если вы пытаетесь достичь доступа к изображениям на уровне пользователя.Но при условии, что вы ограничены в хранилище своей базы данных, хранение изображений в двоичных данных, как вы заявили, неэффективно.
Использование таблицы на пользователя - плохой дизайн.Пользователь, который загрузил файл, должен быть просто полем / столбцом в таблице, в которой хранятся все загружаемые файлы, а также любые метаданные файла.Я предлагаю сгенерировать GUID для имени файла, которое гарантированно будет уникальным и лучше, чем поле автоинкремента, которое легко угадать, если вы пытаетесь запретить пользователям простой доступ ко всем изображениям.
Вызаботясь о производительности, но до тех пор, пока вы не будете иметь дело с миллионами и миллионами записей, ваши запросы на выбор изображений принадлежат пользователю, загруженному в течение определенного периода времени (скажем, вы храните временную метку или аналогичную), за минимальную стоимость.Если скорость является проблемой, вы можете добавить в имя пользователя индекс B-дерева, который значительно ускорит ваши пользовательские запросы к изображениям.
Вернемся к теме безопасности, доступа и организации.Храните изображения в папке на пользователя (хотя в зависимости от количества пользователей количество папок может возрасти до неуправляемого уровня).Если вы не хотите, чтобы изображения были общедоступными, сохраните их в не веб-папке, попросите ваше приложение прочитать данные и передать их в потоковом режиме, чтобы отобразить изображение для пользователя.Сложнее, но вы скрываете фактический файл из Интернета.Кроме того, вы сможете проверять все запросы на изображение для аутентифицированного пользователя.