在数据库中存储图像引用的最佳实践

时间:2012-12-27 00:56:49

标签: sql sql-server database-design

我正在开发一个网站,其中上传到网站的单个图片可能被多个商业模块使用,例如食品项图库或者其他什么 我有一个主图像表,它存储对文件系统上实际图像的引用 现在,此表上的每条记录都可以通过项目,菜肴或图库表来引用 我的问题是,如果所有这些引用都存储在一个表中,或者我应该维护一个单独的表,如ItemImage,DishImage?
单表的问题是我担心这个表会被高命中轰炸,最终增加响应时间。多个表的问题是我必须继续添加更多表,因为业务方面的模块数增加了 如果我说性能是我网站的首要任务,那么最好的方法是什么?

SQL Server 2012,.Net 4.5,MVC 4.

由于

2 个答案:

答案 0 :(得分:6)

我建议使用单个表格。正如@Brandon所提到的,如果索引正确,应该没有性能问题。

我还建议您只存储来自公共根文件夹的相对路径(如@SpectralGhost所推荐)。然后,公共根文件夹可以是一个配置设置,允许操作团队更改文件的存储位置,而无需对数据库进行批量更新。

如果单个文件夹中有数千个文件,则文件系统性能可能会成为问题。我建议为更多的树结构制作几个级别的子文件夹。例如,如果文件名为ABCDE.jpg,则使用A/B/ABCDE.jpg之类的路径会将文件拆分为数千个子文件夹。

我还建议您使用GUID或类似作为上载文件的基本文件名,以避免任何命名冲突(并使用GUID的无破坏版本来保存4个字符)。如果您需要原始文件名,请将其放在图像表的另一列中。存储其他图像元数据,例如宽度,高度和内容类型(例如“image / jpeg”)也是一个好主意。

使用关键字标记系统对每个图像进行分类可能是对图像进行逻辑分组的最佳选择。然后理论上可以将每个图像分配给任意数量的类别(包括零)。这将需要一个标记列表表和一个包含(tag_id, image_id)对的单独映射表。

答案 1 :(得分:5)

这是索引的存在。将它们全部放在一个表中,只要它的索引性能不会成为这种情况的问题。

想想你是否有一本包含1,000,000页的书。即使你作为一个人,只要页面有序,找到任何给定的页码都不会花费很长时间。你在一本100,000,000页的书页中找到一个页面的时间差异确实不会太长。

现在,如果您对数据进行复杂的报告,可能会有所不同,但这只是一个查找表。