Nul*_*ead 5 sql sql-server database-design
我正在开发一个网站,其中上传到网站的单个图像可能被多个业务模块使用,如Food Item,Dish,Gallery等等.
我有一个主图像表,存储对文件系统上的实际图像的引用.
现在,此表上的每条记录都可以通过item,dish或gallery表引用.
我的问题是,如果所有这些引用都存储在一个表上,或者我应该维护一个单独的表,如ItemImage,DishImage?
单表的问题是我担心这个表会被高命中轰炸,最终增加响应时间.多个表的问题是我必须继续添加更多表,因为业务方面的模块数量增加.
如果我说性能是我网站的首要任务,那么最好的方法是什么?
SQL Server 2012,.Net 4.5,MVC 4.
谢谢
我建议使用单个表格.正如@Brandon所提到的,如果索引正确,应该没有性能问题.
我还建议您只存储来自公共根文件夹的相对路径(由@SpectralGhost建议).然后,公共根文件夹可以是配置设置,允许操作团队更改文件的存储位置,而无需对数据库进行批量更新.
如果单个文件夹中有数千个文件,则文件系统性能可能会成为问题.我建议为更多的树结构制作几个级别的子文件夹.例如,如果文件名ABCDE.jpg然后使用类似路径A/B/ABCDE.jpg将文件分割成数千个子文件夹.
我还建议您使用GUID或类似作为上载文件的基本文件名来避免任何命名冲突(并使用GUID的无破坏版本来保存4个字符).如果您需要原始文件名,请将其放在图像表的另一列中.存储其他图像元数据,例如宽度,高度和内容类型(例如"image/jpeg")也是一个好主意.
使用关键字标记系统对每个图像进行分类可能是对图像进行逻辑分组的最佳方法.然后理论上可以将每个图像分配给任意数量的类别(包括零).这将需要标记列表表和包含(tag_id, image_id)对的单独映射表.
这就是索引的作用。将它们全部放在一张表中,只要在这种情况下索引性能不会成为问题。
考虑一下您有一本书中是否包含1,000,000页。即使您是人类,只要页面整齐,找到任何给定的页码也不会花很长时间。在100,000,000页的书中查找页面的时间差异实际上不会更长。
现在,如果您要对数据进行复杂的报告,则可能会有所不同,但这只是一个查询表。