#c# #sql-server-2008 #database-design
#c# #sql-server-2008 #база данных-дизайн
Вопрос:
Я должен хранить свои изображения в переменных (максимальных) полях в базе данных SQLServer 2008 (файловая система не является опцией в моей среде).
Я хотел бы иметь возможность устанавливать свойства изображения и высоты в тегах HTML-изображений при их размещении (в моем приложении MVC2) и выполнять разные действия в галерее в зависимости от книжной или альбомной ориентации.
Итак, исходя из вашего опыта, стоило бы ли это хлопот (и отмены нормализации?) хранить эту информацию в отдельных столбцах базы данных или просто достаточно дешево с точки зрения производительности, чтобы захватывать высоту и ширину и вычислять ориентацию на лету?
Ответ №1:
Насколько легко их получить?
Если вам приходится каждый раз создавать экземпляр объекта для каждого изображения, это приводит к большим ненужным накладным расходам. Я предполагаю, что изображения тоже будут статичными?
Я бы предпочел сохранить значения с уменьшением, если бы они часто использовались.
Ответ №2:
Возможно, вы можете кэшировать размеры при первом запросе изображения. Хорошая особенность varbinary (max) заключается в том, что их относительно легко просмотреть из SQL. Недавно пришлось написать это, чтобы извлечь размеры JPEG из varbinary
CREATE PROCEDURE [SP_GET_JPEG_DIMENSIONS]
(
@image varbinary(max),
@width int OUTPUT,
@height int OUTPUT,
@Xdensity int OUTPUT,
@Ydensity int OUTPUT
)
AS
DECLARE @blocksize INT
DECLARE @datasize INT
DECLARE @i int
SET @i=1
SET @datasize = DATALENGTH(@image);
IF(
--Check for correct lead in
SUBSTRING(@image,@i,1)=0xFF
AND SUBSTRING(@image,@i 1,1)=0xD8
AND SUBSTRING(@image,@i 2,1)=0xFF
AND SUBSTRING(@image,@i 3,1)=0xE0
)
BEGIN
SET @i = @i 4;
IF
(
--Check for JFIF identifier
CHAR(SUBSTRING(@image,@i 2,1))='J'
AND CHAR(SUBSTRING(@image,@i 3,1))='F'
AND CHAR(SUBSTRING(@image,@i 4,1))='I'
AND CHAR(SUBSTRING(@image,@i 5,1))='F'
AND SUBSTRING(@image,@i 6,1)=0x00
)
BEGIN
--get density
SET @Xdensity = SUBSTRING(@image,@i 10,1)*256 SUBSTRING(@image,@i 11,1)
SET @Ydensity = SUBSTRING(@image,@i 12,1)*256 SUBSTRING(@image,@i 13,1)
SET @blocksize = SUBSTRING(@image,@i,1)*256 SUBSTRING(@image,@i 1,1)
WHILE @i < @datasize
BEGIN
SET @i = @i @blocksize
IF SUBSTRING(@image,@i,1) <> 0xFF RETURN -1 --not a good block
IF SUBSTRING(@image,@i 1,1) = 0xC0 --image size block
BEGIN
SET @height = SUBSTRING(@image,@i 5,1)*256 SUBSTRING(@image,@i 6,1)
SET @width = SUBSTRING(@image,@i 7,1)*256 SUBSTRING(@image,@i 8,1)
END
ELSE -- some other sort of block - move onto the next one
BEGIN
SET @i = @i 2
SET @blocksize = SUBSTRING(@image,@i,1)*256 SUBSTRING(@image,@i 1,1)
END
END
END
ELSE
BEGIN
SET @width = -1
END
END
ELSE
BEGIN
SET @height = -1
SET @width = -1
END
RETURN
GO