【发布时间】:2010-09-25 05:28:07
【问题描述】:
我将不同的项目(笔记、文章、图片、文件)存储在一个表中(所有项目类型都有许多共同的元数据 - 例如,类别、标签、评级、统计信息等)。
我的第一个设计是这样的:Items 表,以及每个项目类型的另一个“详细”表(NoteItems、ArticleItems 、图片项等)。要检索单个项目,表必须一对一连接(SELECT * FROM Items INNER JOIN PictureItems ON Items.Id = PictureItems.Id WHERE Items.Id = N)。
我很确定这种“按部就班”的设计会很好地工作(多次这样做),但是,我开始怀疑这种设计是否过于矫枉过正。有一个表(Items)会简单得多。
假设有大约 5% 的图片或文件类型的项目。
现在的问题是:如果我选择(几乎)单表设计,是否最好为图像字段提供详细表(当然是图片和文件项)?
场景一:只有一张表:Items(用于存放笔记、文章、图片、文件...)
场景2:两张表:Items(用于存放笔记、文章、图片文件)、ImageItems(仅用于存放item类型图片、文件的图片字段);一对一的关系
(场景 3 是场景 2 的一个小变化;有 3 个表(项目、图片项目、文件项目))
方案一的优点是:
- 更简单的选择查询(无连接)
- 无事务更新(在 INSERT/UPDATE 时仅更新一个表)
- 无事务更新带来的性能和可扩展性?
方案 2 的优点是:
- 更简洁的设计
- 降低数据消耗(在场景 1 中,大约 95% 的非图片或文件类型的项目在图像字段中具有 NULL 值,即浪费了大约 16 个字节用于指针)
您会选择哪种方案:1(无事务更新)或 2(更低的数据消耗)?感谢您的意见。
【问题讨论】:
-
我们正在处理一个文件内容存储在数据库字段中的案例,不是吗?你有没有想过在你的数据库中存储文件名(以及最终的路径)?
-
我通常避免将二进制数据放入数据库。路径效果很好。
标签: sql sql-server performance database-design scalability