我们有大约50万个图像驻留在文件系统中。多个图像属于产品,并以ProductID命名。例如,产品ID 10010有3个图像; 10010_1.jpg,10010_2.jpg和10010_3.jpg。要在照片库中显示这3个图像,经典ASP中的当前代码正在查询文件系统。代码看起来像这样:
Dim objFSO, i
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
i=1
While objFSO.FileExists(Server.MapPath(productid & "_" & i & ".jpg")
' draw the image
i = i + 1
WEnd
将图像名称保存在数据库表中并运行查询以获取给定产品的可用图像列表是不是更好?我很确定从数据库中读取它更好。只是不情愿,因为我需要一个有50万条记录的大桌子。哪种方式更有效?
我的表格看起来像这样:
ID ProductID ImageURL
-------------------------------------------
1 10010 10010_1.jpg
2 10010 10010_2.jpg
3 10010 10010_3.jpg
4 10011 10011_1.jpg
. . .
有什么建议吗?我正在ASP .NET MVC 3中重写这个网站。我需要在这个平台/框架中做些什么吗?
答案 0 :(得分:2)
IMO,您可以实施两种解决方案之一。
混合 - 使用数据库将文件路径存储到文件系统上存在的文件中。
NoSQL - 完全脱离数据库并使用NoSQL解决方案,该解决方案提供了访问文件系统上文件的API。
我已经看到使用了两种实现,在#2出现之前#1变得流行。即使我已经使用#1更长时间,我觉得#2是存储“资产”数据(图像,html描述,视频文件)的最佳选择。 NoSQL在访问资产数据方面优于MySQL的主要原因是,您不是为了拉动文件路径而浪费宝贵的数据库连接。
另外,另一项建议;使用productids作为父目录将您的目录分块。考虑一下:
# yours
dir1
... 125K files
dir2
... 125K files
# chunked (parent dirs are product ids)
3
... 3 files
4
... 2 files
5
... 3 files
在只有少数(<100个文件)的目录中统计文件比在数千个文件的目录中的stat文件快得多。
答案 1 :(得分:0)
数据库中有50万条记录并不是那么大。
如果您的表被正确编入索引,那么您将从数据库获得比文件系统更好的性能。
答案 2 :(得分:0)
是的,在DB中存储文件路径会使总体情况变得更好,即使有一些性能损失也会更好。
请注意,在磁盘(文件)和数据库(文件路径)上存储数据会使数据不一致的应用程序出现新的错误类。在迁移过程中考虑到这一点。
由于问题的性能部分 - 如果性能受到关注,您的数据集的原型和度量。原型设计/测量时需要考虑的事项:
答案 3 :(得分:0)
要考虑的事情。我假设它是一个.NET堆栈,所以: