2012-12-27 156 views
3

我正在开发一个网站,上传到网站的单个图像可以由多个业务模块用于像食品画廊或什么的。
我有一个主要的图像表存储对文件系统上的实际图像的引用。
现在,此表上的每个记录都可以通过项目,菜肴或图库表引用。
我的问题是,如果所有这些引用存储在一张桌子上,或者我应该维护一个单独的表,如ItemImage,DishImage?
单桌问题是我担心这张桌子会被高命中轰炸,最终增加响应时间。多个表格的问题是随着模块数量的增加,我不得不增加更多的表格。
如果我说性能是我网站的重中之重,那么最好的方法是什么?最佳实践,用于存储图像引用数据库

SQL Server 2012中,.NET 4.5,MVC 4

感谢

+0

*表格可以包含数以百万计的数百万条记录。这不是问题*相反,请考虑:模型中“图像类型”的*角色*是什么?它是'xImage',其中'x'代表未定或增长集合中的某些东西?或者'x'是否代表了一个有限的选择集合(与其他表格有关)中的一个值?这个问题听起来像是前者,在这种情况下......这是直接的答案! – 2012-12-27 01:17:44

+0

所以说食物和图像是多对多的? –

+0

我将使用单个表格 – chamara

回答

5

我会推荐使用一张表。正如@Brandon所说的,如果索引正确,就不应该有性能问题。

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

如果在单个文件夹中有数千个文件,文件系统性能可能会成为问题。我建议为更多的树结构创建几个子文件夹级别。例如,如果文件名是ABCDE.jpg,那么使用像A/B/ABCDE.jpg这样的路径将文件分割成数千个子文件夹。

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

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

+0

感谢您回答未知的问题。 –

4

这是存在哪些索引。将它们全部放在一张表中,只要它被编入索引,对于这种情况,性能不会成为问题。

想想如果你有一本书有1,000,000页的书。即使对于你作为人类来说,只要页面是有序的,就不需要很长的时间才能找到任何给定的页码。在100,000,000页的书中找到页面的时间差别实际上不会太长。

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