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

标签 sql sql-server database-design

我正在开发一个网站,上传到该网站的单个图像可由多个业务模块使用,例如食品菜肴图库 或其他什么。
我有一个主图像表,用于存储对文件系统上实际图像的引用。
现在,该表中的每条记录都可以通过项目、菜肴或图库表进行引用。
我的问题是,所有这些引用是否应该存储在一个表中,还是应该维护一个单独的表,如 ItemImage、DishImage?
单个表的问题是我担心该表会受到高点击率的轰炸,最终增加响应时间。多个表的问题是,随着业务方面模块数量的增加,我必须不断添加更多表。
如果我说性能是我网站的首要任务,那么最好的方法是什么?

SQL Server 2012、.Net 4.5、MVC 4。

谢谢

最佳答案

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

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

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

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

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

关于sql - 在数据库中存储图像引用的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14048135/

相关文章:

使用长 IN 子句的 SQL 优化

SQL错误: The multi-part identifier "tableName.ColumnName" could not be bound

c# - 如何获取我的全文目录中使用的停用词列表?

sql-server - 本地机器和云实例之间的单向 SymmetricDS 同步

database-design - 映射或单独属性之间的 DynamoDB 性能/成本差异

sql - 从数据库中删除记录的替代方法?

sql - 为什么我的 CASE 表达式是不确定的?

mysql - 计算 2 个不同表中 2 列之间的百分比

sql - Postgres 按列分组,并在组内按最大聚合选择其他列

database - 我怎么能打开 .erx 文件?