Хранить измерения (вместе с изображением) в столбцах базы данных?

#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