在数据库列中存储维度(以及图像)?

时间:2011-04-30 13:42:07

标签: c# sql-server-2008 database-design

我必须将我的图像存储在SQLServer 2008数据库的varbinary(max)字段中(文件系统不是我环境中的选项)。

我希望能够在我提供这些标签时(在我的MVC2应用程序中)设置HTML图像标签上的图像和高度属性,并根据纵向和横向方向在图库中执行不同的操作。

那么,从你的经验来看,将这些信息存储在数据库的不同列中是否值得麻烦(和去规范化?),或者只是在性能方面足够便宜,以获得高度和高度。宽度和宽度在飞行中计算方向?

2 个答案:

答案 0 :(得分:2)

获得它们有多容易?

如果您为每个图像实例化一个对象每个时间,这会增加许多不必要的开销。我假设图像也是静态的?

如果经常使用这些值,我倾向于将值存储下来。

答案 1 :(得分:2)

您可以在第一次请求图像时缓存尺寸。关于varbinary(max)的好处是它们相对容易从SQL中查找。最近不得不写这个来从varbinary中提取JPEG大小

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