我正在为系统编写关系数据模型,该系统跟踪在浏览器中呈现的一组框,每个框都包含渲染图像。
目前,有一个表:Box。每行都有x和y坐标,宽度和高度列,以及图像内容类型(例如mime类型)和内容位置(例如文件路径或URL)的列。
有些盒子有一层嵌套 - 即一个盒子可以包含另一个盒子。在这些情况下,内容类型列具有特殊值'框'并且该位置是对Box表的自引用。
某些内容类型(少数)具有与内容类型相关联的额外值,例如如果图像文件是更复杂的多页面格式(例如PDF),那么我需要存储将在框中呈现的页面。
可以/我应该在一个表中表示这个吗?在这种情况下,额外的参数可以存储(例如)作为文件URL中的查询字符串(/path/to/PDF.pdf?page=4)。
如何处理更新自引用Box行?即如果我删除包含另一个框的框,则应删除这两行。我不能在location列上使用外键约束,因为它可以是url(对于非嵌套框)或Box行id(对于嵌套框)。
答案 0 :(得分:0)
我会尝试提供一些想法 -
可以/我应该在一个表中表示这个吗?在这种情况下,额外的参数可以存储(例如)作为文件URL中的查询字符串(/path/to/PDF.pdf?page=4)。
根据您解释的上述模型,有可能出现这种情况 一个。带有一个图像的多个盒子(单页面格式) - 几个盒子包含相同的图像 湾带有一个图像的多个框(多页面格式) - 几个框包含相同PDF的相同/不同图像。
为了使模型更通用,我们可以假设每个框引用一个image
表,它可以容纳任何类型的图像。这有助于 - 规范化表格,并且在将来的扩展中也很有用(具有向后兼容性选项)。
假设与图像相关,您想要添加另一个字段(列) - 然后更改image
表而不是添加到主表就足够了。
如果多个方框引用相同的图像,只需一个引用计数器就足以将所有信息集存储在image
表中而不会重复数据。
当然 - 额外的开销(我认为会很小)会引用另一张表。
如何处理更新自引用Box行?即如果我删除包含另一个框的框,则应删除这两行。我不能在location列上使用外键约束,因为它可以是url(对于非嵌套框)或Box行id(对于嵌套框)。
使用外键约束限制,在应用程序逻辑中有一个选项需要遍历所有框,直到找到派生最多的子(框)并首先删除它们。然后为所有盒子做这些事情。 Idea与删除复杂树类似。但这会增加实现删除框的应用程序逻辑。
HTH!