Насколько велики эти изображения и сколько вы ожидаете иметь? Хотя я в основном согласен с @sp_BlitzErik , я думаю, что есть некоторые сценарии, в которых это можно сделать, и поэтому было бы полезно получить более четкое представление о том, что на самом деле запрашивается здесь.
Вот некоторые варианты, которые следует учитывать, чтобы смягчить большинство негативных аспектов, указанных Эриком:
Обе эти опции предназначены для того, чтобы быть средним звеном между хранением больших двоичных объектов либо полностью в SQL Server, либо полностью снаружи (за исключением строкового столбца для сохранения пути). Они позволяют BLOB-объектам быть частью модели данных и участвовать в транзакциях, не тратя пространство в пуле буферов (то есть в памяти). Данные BLOB по-прежнему включены в резервные копии, что делает их занимающими больше места и занимающими больше времени для резервного копирования ичтобы восстановить. Тем не менее, я с трудом воспринимаю это как настоящий минус, учитывая, что если оно является частью приложения, то необходимо каким-то образом выполнить резервное копирование, а наличие только строкового столбца, содержащего путь, полностью отключается и позволяет файлам BLOB получить удаляется без указания на это в БД (т.е. неверные указатели / отсутствующие файлы). Это также позволяет «удалять» файлы внутри БД, но они все еще существуют в файловой системе, которую в конечном итоге необходимо будет очистить (например, от головной боли). Но если файлы ОГРОМНЫЕ, то, возможно, лучше оставить полностью вне SQL Server, за исключением столбца пути.
Это помогает с вопросом «внутри или снаружи», но не затрагивает вопрос «одна таблица против нескольких таблиц». Могу сказать, что помимо этого конкретного вопроса, безусловно, существуют веские случаи для разделения таблиц на группы столбцов на основе шаблонов использования. Часто, когда у одного есть 50 или более столбцов, есть те, к которым часто обращаются, а некоторые нет. Некоторые столбцы часто пишутся, а некоторые в основном читаются. Разделение часто обращающихся и редко используемых столбцов на несколько таблиц, имеющих отношение 1: 1, довольно часто полезно, потому что зачем тратить пространство в пуле буферов для данных, которые вы, вероятно, не используете (аналогично тому, как хранить большие изображения в обычном режиме).VARBINARY(MAX)
столбцы это проблема)? Вы также повышаете производительность часто используемых столбцов, уменьшая размер строки и, следовательно, размещая больше строк на странице данных, делая чтение (как физическое, так и логическое) более эффективным. Конечно, вы также вносите некоторую неэффективность, когда вам нужно дублировать PK, и теперь иногда вам нужно объединить две таблицы, что также усложняет (хотя и незначительно) некоторые запросы.
Итак, есть несколько подходов, которые вы можете использовать, и что лучше всего зависит от вашей среды и того, что вы пытаетесь достичь.
У меня сложилось впечатление, что SQL Server хранит в таблице только указатель на некоторую выделенную структуру данных BLOB.
Не все так просто. Вы можете найти некоторую полезную информацию здесь, каков размер указателя большого объекта для (MAX) типов, таких как Varchar, Varbinary, Etc? , но основы таковы:
TEXT
, NTEXT
и IMAGE
типы данных (по умолчанию): 16-байтовый указатель
VARCHAR(MAX)
, NVARCHAR(MAX)
, VARBINARY(MAX)
(По умолчанию):
- Если данные могут поместиться в строке, то она будет размещена там
- Если данные меньше, чем ок. 40 000 байт (в связанном сообщении блога верхний предел показывает 40000, но мое тестирование показало немного более высокое значение) И если в строке есть место для этой структуры, то будет от 1 до 5 прямых ссылок на страницы больших объектов, начиная с 24 байта для первой ссылки на первые 8000 байтов и увеличение на 12 байтов на каждую дополнительную ссылку для каждого дополнительного набора из 8000 байтов, максимум до 72 байтов.
- Если данные превышают ок. 40 000 байт ИЛИ недостаточно места для хранения соответствующего количества прямых ссылок (например, в строке осталось только 40 байт, а для значения 20 000 байт требуется 3 ссылки, что составляет 24 байта для первых плюс 12 для двух дополнительных ссылок для 48 байтов всего необходимого пространства в строке), тогда будет просто 24-байтовый указатель на страницу текстового дерева, которая содержит ссылки на страницы больших объектов).