代码之家  ›  专栏  ›  技术社区  ›  Tony Basallo

数据库中的数据URI与二进制

  •  7
  • Tony Basallo  · 技术社区  · 12 年前

    我正在使用DATAURI(客户端,使用画布)将图像发布到服务器。我现在有两个选择:我可以将“image”保存为varchar(max)列中的字符串,也可以将其转换为byte[]并保存为varbinary(max)。

    就实施而言,努力是一样的。我正试图确定哪种方法更有效,比如1:数据库中的空间和2:显示图像。有人看过关于这方面的分析吗?或者有很好的方法来衡量这一点吗?

    仅供参考——一张3kb的图像在数据库中大约有10万个字符。

    使用:ASP.NET 4.5、MVC、SQL Server 2008

    澄清

    我可以像通常的情况一样,使用varbinary(MAX)列中的byte[]将图像存储在数据库中,也可以从HTML5画布中存储DATA URI,看起来像 数据:图像/png;base64、iVBORw0K。。。 在varchar(max)列中。

    存储字节[]是典型的,不需要进一步解释。存储DATA URI只是一个字符串,而显示图像将是一个问题:

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

    我的问题是,哪一个更具性能和节省空间,是否有任何文档、白皮书或分析围绕这一具体比较。

    1 回复  |  直到 12 年前
        1
  •  8
  •   Tony Basallo    12 年前

    由于没有真正的答案,也没有什么信息可以在谷歌上找到Binging,我做了一个简单的定时测试,插入了2万条记录(少于这一点毫无意义),并在循环中一次选择一条记录。我使用PetaPoco访问数据库。如果你发现了什么或有一些信息,请分享。我认为这将是一个更常见的场景,数据URI将受到更多的关注。

    URI的插入和选择始终更快。相对速度更快,因为它是以毫秒为单位测量的。这不应该是一个因素,而是更容易的因素。

    至于渲染到客户端。我使用了两个方法,一个是MVC操作方法的ImageResult(返回图像的自定义ActionResult)(这是在http响应中渲染图像),返回URI字符串并将其用作图像SRC(即SRC=“@Model.URI”)。同样,几乎没有区别。使用Chrome开发工具的结果:

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

    然而,我确实注意到ImageResult(byte[])版本将自动被浏览器缓存,因为它是一个用于所有意图和目的的图像。浏览器不会自动缓存DATA URI版本。

    从这个基本的测试来看,byte[]是可行的,因为浏览器可以自动缓存,并且所有其他结果都是相等的。

    我的设置: i7,8GB内存,固态硬盘,SQL Server 2012,IIS Express

    缓存的好处是我在没有设置的情况下注意到的。是的,我相信可以管理HTTP头、etag、输出缓存等。