我将不同的项目(笔记、文章、图片、文件)存储在一个表中(所有项目类型都有许多共同的元数据 - 例如,类别、标签、评级、统计信息等)。
我的第一个设计是这样的:表Items,加上每个项目类型(NoteItems、ArticleItems、PictureItems等)的另一个“详细”表。要检索单个项目,表必须一对一连接(SELECT * FROM Items INNER JOIN PictureItems ON Items.Id = PictureItems.Id WHERE Items.Id = N)。
我很确定这种“按部就班”的设计会很好地工作(多次这样做),但是,我开始怀疑这种设计是否是矫枉过正。拥有一个表(Items)会简单得多。
假设有大约 5% 的图片或文件类型的项目。
现在,问题是:如果我选择(几乎)单表设计,那么无论如何都有图像字段的详细表会更好(当然,对于图片和文件项)?
场景一:只有一张表:Items(用于存放笔记、文章、图片、文件...)
场景二:两张表:Items(用于存储笔记、文章、图片文件)、ImageItems(仅用于存储item类型图片、文件的图片字段);一对一的关系
(场景 3 是场景 2 的一个小变体;有 3 个表(项目、图片项目、文件项目))
方案 1 的优点是:
- 更简单的选择查询(无连接)
- 无事务更新(INSERT/UPDATE 仅更新一张表)
- 无事务更新带来的性能、可扩展性?
方案 2 的优点是:
- 更清洁的设计
- 较低的数据消耗(在场景 1 中,除了图片或文件之外,大约 95% 的类型项在图像字段中具有 NULL 值,即浪费了大约 16 个字节用于指针)
您会选择哪种方案:1(无事务更新)或 2(更低的数据消耗)?感谢您的意见。