5

我们只是将我们的 ASP.Net 商店实现(从简单的)升级到应该更灵活的结构。我只是在寻找一些如何存储与产品相关的图像的选项。(将有两种类型的图像,产品的拇指和产品的全视图图像)。它应该处理至少一百种产品。

到目前为止,我正在考虑两个选项:
1)将图像存储在 db 中 - 图像从 Db 加载到流中,然后加载到图像中(使用 IHttpHandler 显示)
优点
- 图像本身是类的一部分,我们正在使用的业务对象代码隐藏
- 一个维护产品数据的地方
缺点
- 内存消耗 - 当我们从其他 API 获取产品数据时,流量会增加

2)将图像 存储在文件系统中 - 图像作为
链接放入页面
中对于文件系统中的图像(甚至可能是一些文件夹结构) - 更复杂的图像维护



还有其他合适的机制吗?你会建议使用什么?

就个人而言,我更喜欢文件系统中的图像,但由于有两个不同的位置,因此维护它可能会更困难。

感谢您的任何评论。X。

BTW:我真的可以想象,在某个阶段,产品也会有一些视频或任何其他媒体也需要展示。在这种情况下,Db 并不是真正的选择,不是吗?

4

5 回答 5

4

我做了一个与此类似的系统。在我看来,页面加载速度胜过所有其他考虑因素,因此我选择了“将图像存储在磁盘上”选项。

当图像被添加到系统中时,原始图像会被裁剪并调整为所需的显示尺寸以供浏览,并且还会生成缩略图。然后将三幅图像存储到磁盘,即原始图像、显示尺寸和缩略图。每个都有为其文件名生成的 GUID。

(想象一下在亚马逊上购物,当您浏览产品列表时,只有缩略图可见。当您检查产品时,会显示其显示尺寸,您通常可以再次单击图像以查看完整尺寸。)

我有一个看起来有点像这样的数据库表。

ID                int, PK
FullSizePath      varchar(128)
DisplaySizePath   varchar(128)
ThumbNailPath     varchar(128)
OriginalData      BLOB

我将原始数据保留在数据库中,以防文件服务器发生事故并且图像被删除,因此它们都可以重新生成。但是在页面请求期间,这些数据永远不会从数据库中提取。

于 2009-07-03T10:23:38.643 回答
1

我认为两者的混合是最好的,对于小的关键图像 db 更可取,对于大量和大小的文件系统更好

于 2009-07-03T09:28:21.817 回答
0

我想你已经涵盖了任何东西。您可以将主图像存储在文件系统/数据库中,但您可以通过编程方式动态生成缩略图,这将减少一些磁盘空间。

于 2009-07-03T09:25:30.560 回答
0

在像您的示例这样的情况下,我工作的地方我们倾向于将图像存储在磁盘上,然后将文件名记录在数据库中。

然后,当您拥有产品数据库时,您可以查找并动态加载每个产品的图像。

如果您有一个用于添加/删除/编辑产品的管理系统,这也非常好。

我想这介于您的两个原始建议之间,如果您愿意,您甚至可以将所有图像存储在同一个目录中。

于 2009-07-03T09:31:17.210 回答
0

如果您使用的是 MS SQL 2008,则可以选择FILESTREAM 功能

这是要点,但您应该阅读整个白皮书:

FILESTREAM 是 SQL Server 2008 版本中的一项新功能。它允许将结构化数据存储在数据库中,并将相关的非结构化(即 BLOB)数据直接存储在 NTFS 文件系统中。然后,您可以通过高性能 Win32® 流 API 访问 BLOB 数据,而不必支付通过 SQL Server 访问 BLOB 数据的性能损失。

FILESTREAM 始终保持结构化和非结构化数据之间的事务一致性,甚至允许使用日志备份对 FILESTREAM 数据进行时间点恢复。一致性由 SQL Server 自动维护,不需要应用程序中的任何自定义逻辑。FILESTREAM 机制通过维护数据库事务日志的等效项来做到这一点,该日志具有许多相同的管理要求(在本白皮书后面的“配置 FILESTREAM 垃圾收集”部分中进行了更详细的描述)。数据库的事务日志与 FILESTREAM 事务日志的组合允许正确地以事务方式恢复 FILESTREAM 和结构化数据。

于 2009-09-10T20:17:23.390 回答