Data URI и двоичный файл в базе данных

Я отправляю изображение на сервер, используя DATA URI (клиентская сторона, используя холст). Теперь у меня есть два варианта: я могу сохранить «изображение» в виде строки в столбце varchar(max) или преобразовать его в byte[] и сохранить как varbinary(max).

Что касается реализации, усилия одинаковы. Я пытаюсь определить, что будет более эффективным с точки зрения 1: места в БД и 2: отображения изображения. Кто-нибудь видел какой-либо анализ по этому поводу или есть хороший способ измерить это?

AN FYI - изображение размером 3 КБ составляет около 100 000 символов в БД.

Использование: ASP.NET 4.5, MVC, SQL Server 2008

Чтобы уточнить

Я могу либо сохранить изображение в базе данных, используя byte[] в столбце varbinary(MAX), как это обычно бывает, либо я могу сохранить DATA URI из холста HTML5, который выглядит как data:image/png;base64, iVBORw0K... в столбце varchar(max).

Хранение byte[] является типичным и не требует дополнительных пояснений. Хранение DATA URI — это просто строка, а отображение изображения — это вопрос:

<img src="data:image/png;base64,iVBORw0K" /> or
<img src="@Model.Uri" />

Мой вопрос заключается в том, какой из них более эффективен и экономит место, и есть ли какая-либо документация, технический документ или анализ по этому конкретному сравнению.


person Tony Basallo    schedule 21.02.2013    source источник
comment
Это было полезно. Есть ссылка? Я искал 40 минут и не могу найти такого сравнения.   -  person Tony Basallo    schedule 21.02.2013
comment
вы бы использовали varbinary(max), а не varchar(max)   -  person Mitch Wheat    schedule 21.02.2013
comment
Хотя я ценю ваши усилия, вопрос был не о сохранении изображения в базе данных — это заняло бы у меня 7 секунд ;) — речь о сохранении URI ДАННЫХ вместо byte[]/blob, который обычно сохраняется.   -  person Tony Basallo    schedule 21.02.2013
comment
Тони, как ты его хранил? Как varchar или двоичный файл?   -  person Diego Gallegos    schedule 27.10.2016


Ответы (1)


Без реального ответа и с небольшим количеством информации, найденной с помощью Binging с Google, я провел простой тест на время, вставив 20 000 записей (меньше, чем это было бессмысленно) и выбрав одну запись за раз в цикле. Я использовал PetaPoco для доступа к БД. Если вы что-то там нашли или у вас есть какая-то информация, пожалуйста, поделитесь. Я думаю, что это будет более распространенный сценарий, когда DATA URI будет привлекать больше внимания.

URI постоянно быстрее вставлял и выбирал. Быстрее относительно, потому что измеряется в миллисекундах. Это не должно быть фактором - это то, что проще.

Что касается рендеринга клиенту. Я использовал два метода: ImageResult (пользовательский ActionResult, который возвращает изображение) из метода действия MVC (это рендеринг изображения в ответе http) и возврат строки URI и использование ее в качестве SRC изображения (т.е. src="@ Модель.Ури"). Опять же, почти никакой разницы. Результаты с использованием инструментов разработчика Chrome:

ImageResult: 2 requests, 200ms, 3.2KB
DATA URI: 2 requests, 200ms, 3.9KB

Однако я заметил, что версия ImageResult (byte[]) автоматически кэшируется браузером, потому что это изображение для всех намерений и целей. Версия DATA URI не кэшируется браузером автоматически.

Из этого рудиментарного тестирования следует, что byte[] — это путь из-за автоматического кэширования браузером и прочих равных результатов.

Моя конфигурация: i7, 8 ГБ ОЗУ, SSD, SQL Server 2012, IIS Express

Преимущество кэширования я заметил без настройки. Да, я уверен, что можно управлять заголовками HTTP, etag, кэшированием вывода и т. д.

person Tony Basallo    schedule 22.02.2013