0

我正在为一个系统编写一个关系数据模型,该模型跟踪浏览器中呈现的一组框,每个框都包含渲染图像。

目前,只有一个表:Box。每行都有 x 和 y 坐标、宽度和高度列,以及用于图像内容类型(例如 mime 类型)和内容位置(例如文件路径或 URL)的列。

有些盒子有一层嵌套——即一个盒子可以包含另一个盒子。在这些情况下,内容类型列具有特殊值“box”,并且位置是对 Box 表的自引用。

某些内容类型(少数)具有与内容类型相关的额外值,例如,如果图像文件是更复杂的多页格式(例如 PDF),那么我需要存储将在框中呈现的页面。

  • 我可以/应该在一张表中表示这个吗?在这种情况下,额外的参数可以(例如)作为查询字符串存储在文件 URL (/path/to/PDF.pdf?page=4) 中。

  • 如何处理更新自引用 Box 行?即,如果我删除一个包含另一个框的框,则应删除两行。我不能在位置列上使用外键约束,因为它可以是 url(用于非嵌套框)或框行 ID(用于嵌套框)。

4

1 回答 1

0

我将尝试提供一些想法-

我可以/应该在一张表中表示这个吗?在这种情况下,额外的参数可以(例如)作为查询字符串存储在文件 URL (/path/to/PDF.pdf?page=4) 中。

使用您解释的上述模型,有可能的机会
a。一个图像的多个框(单页格式) - 几个框包含相同的图像。
湾。一个图像的多个框(多页格式) - 几个框包含相同 PDF 的相同/不同图像。

为了使模型更通用,我们可以假设每个框都指向一个image可以容纳任何类型图像的表格。这有助于对表格进行规范化,并且在将来的扩展中也可能有用(具有向后兼容性选项)。

假设与图像相关,您想添加另一个字段(列) - 然后与其添加到主表,更改image表就足够了。

在多个框引用同一图像的情况下,只需一个引用计数器就足以将所有信息集存储在image表中而无需数据重复。

当然 - 额外的开销(我认为会很小)将引用另一个表。

如何处理更新自引用 Box 行?即,如果我删除一个包含另一个框的框,则应删除两行。我不能在位置列上使用外键约束,因为它可以是 url(用于非嵌套框)或框行 ID(用于嵌套框)。

使用外键约束限制,一个选项是在应用程序逻辑中,您需要遍历所有框,直到找到最派生的子(框)并首先删除它们。然后对所有的盒子做这样的事情。想法类似于删除复杂的树。但这会增加您实现删除框的应用程序逻辑。

于 2013-02-01T11:15:54.150 回答