Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 是否在sql数据库中保存图像url或图像文件?_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Database Design - Fatal编程技术网

Asp.net 是否在sql数据库中保存图像url或图像文件?

Asp.net 是否在sql数据库中保存图像url或图像文件?,asp.net,asp.net-mvc,asp.net-mvc-3,database-design,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Database Design,我们可以用两种方式保存图像 在服务器中上载图像,并在数据库中保存图像url 直接将图像保存到数据库中 哪一个更好?像许多问题一样,ansewr是“视情况而定”。SharePoint之类的系统使用选项2。许多票证跟踪系统(我确信Trac会这样做)使用选项1 还要考虑任何(潜在的)限制。随着卷的增加,您是否会受到数据库大小的限制?这与托管数据库和应用程序尤其相关,在托管数据库和应用程序中,增加数据库的大小比增加存储分配要昂贵得多。微软研究院有一篇非常好的论文,名为 经过大量性能测试和分析,他们得出的

我们可以用两种方式保存图像

  • 在服务器中上载图像,并在数据库中保存图像url
  • 直接将图像保存到数据库中

  • 哪一个更好?

    像许多问题一样,ansewr是“视情况而定”。SharePoint之类的系统使用选项2。许多票证跟踪系统(我确信Trac会这样做)使用选项1


    还要考虑任何(潜在的)限制。随着卷的增加,您是否会受到数据库大小的限制?这与托管数据库和应用程序尤其相关,在托管数据库和应用程序中,增加数据库的大小比增加存储分配要昂贵得多。

    微软研究院有一篇非常好的论文,名为

    经过大量性能测试和分析,他们得出的结论如下:

    • 如果图片或文档的大小通常小于256K,则将其存储在数据库
      VARBINARY
      列中会更有效

    • 如果图片或文档的大小通常超过1MB,则将其存储在文件系统中会更高效(使用SQL Server 2008的
      FILESTREAM
      属性,它们仍然处于事务控制之下,并且是数据库的一部分)

    • 在这两者之间,这取决于你的使用情况

    如果您决定将图片放入SQL Server表中,我强烈建议您使用单独的表来存储这些图片-不要将employee foto存储在employee表中-将它们保存在单独的表中。这样,Employee表可以保持精简、平均和非常高效,前提是您不需要在查询中也选择Employee foto

    对于文件组,请查看介绍。基本上,您可以从一开始就为大型数据结构使用单独的文件组创建数据库,或者稍后添加一个额外的文件组。我们称之为“大数据”

    现在,无论何时创建需要存储
    VARCHAR(MAX)
    VARBINARY(MAX)
    列的新表,都可以为大数据指定此文件组:

     CREATE TABLE dbo.YourTable
         (....... define the fields here ......)
         ON Data                   -- the basic "Data" filegroup for the regular data
         TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data
    

    查看文件组上的MSDN简介,并使用它

    将图像保存到服务器将更好地用于网站,因为这些图像是网站附带的,比如每个客户的品牌图像-如果您正在设置下一个Flickr,答案显然会有所不同:)。您需要设置一个服务器作为文件服务器,共享/uploaded_images目录(或任何您命名的目录),并设置一个应用程序变量来定义上传图像的基本url。为什么更好?成本。文件服务器是非常便宜的商品硬件。您可以使用极其便宜的商品(甚至只是消费者级)备份软件备份文件内容。如果你的文件服务器发出嘎嘎声,有人丢失了一天上传的图像?谁在乎。他们只是再次上传。我们的数据库服务器是一个运行在SSD SAN上的企业集群。我们的备份和传输日志通过昂贵的带宽传送到远程站点,甚至在磁带上维护x周期。我们将其用于所有需要RDBMS的ACID(原子性、一致性、隔离性、耐久性)好处的数据。我们不会将其用于公司徽标。

    将其存储在数据库中,除非您有充分的理由不这样做

    将它们存储在文件系统中是过早的优化

    有了一个数据库,您可以获得引用完整性,您可以一次备份所有内容,集成安全性,等等


    SQL Anti Patterns一书将在文件系统中存储文件称为一种反模式。

    更好的标准是什么?看看这个:我并不真正理解filestream的意义。如果你在做文件系统,就做文件系统。文件系统是为文件设计的。数据库不是。您是否将网站代码存储在文件系统或数据库中?存储url而不是文件丝毫不会影响安全性。如果您不关心引用完整性,那么应该将它们存储在文件系统中。当然,如果您不关心引用完整性,那么为什么要使用数据库?用于数据。url是数据。它需要匹配引用完整性-例如指向真实的公司id或类别id。图像文件的内容永远不会影响引用完整性。图像非常适合web层。最简单的网站就是静态html文件和静态图像文件。图像由针对该任务优化的web服务器非常高效地提供。如果有人不停地更改他们的徽标图像,但保持相同的名称,为什么要用新的blob更新您的数据库?如果这些不是客户机图像而是您的,那么您可以始终在subversion等中跟踪它们,因此当我备份患者数据库并忘记备份患者的x光片时,这没关系,因为它们是web层的。哈哈,我们最近开始使用OpenStack。这是一个存储图像的好地方,您可以内置复制功能。我们的关系数据库仍然不是一个好地方。有一个小组正在工作,将图像存储在数据库中,但它的速度太慢,无法用于网站上的任何内容。如果您使用的是较小的非web系统,并发用户数量较少,那么您可能没有遇到这里的限制。对我们来说,这不是过早的优化。文件系统对于我们实际控制的所有图像来说都太慢,我们使用Akamai CDN来提供这些图像。