Mysql 对于可能被“丢弃”的物体,什么是合适的桌子设计

Mysql 对于可能被“丢弃”的物体,什么是合适的桌子设计,mysql,database-design,Mysql,Database Design,我正在设计一个简单的媒体服务器,作为更大应用程序的一部分。我选择采用与AWSS3服务类似的术语,即对象和存储桶,即文件和目录 我有两张桌子: cdn_bucket id, directory 及 数据库中的其他表可以包含使用cdn_object.id上的外键的对象。这有很好的副作用,因为我可以指定一个约束,在对象被删除时设置字段NULL,或者如果需要的话,确实可以阻止删除。e、 g: blog_post id, title, body, featured_image CONSTRAINT: f

我正在设计一个简单的媒体服务器,作为更大应用程序的一部分。我选择采用与AWSS3服务类似的术语,即对象和存储桶,即文件和目录

我有两张桌子:

cdn_bucket
id, directory

数据库中的其他表可以包含使用cdn_object.id上的外键的对象。这有很好的副作用,因为我可以指定一个约束,在对象被删除时设置字段NULL,或者如果需要的话,确实可以阻止删除。e、 g:

blog_post
id, title, body, featured_image
CONSTRAINT: featured_image = cdn_object.id ON DELETE SET NULL
有一次我被告知我不应该删除东西,即使这是另一篇文章的理由,请不要在这里评论;因此,is_deleted标志。为了澄清这个问题,这就是我所说的垃圾,即可回收的

这非常有效,但是我无法利用约束的级联功能,即我将对象标记为已删除,但引用表(例如blog_post.featured_image)引用了旧ID

我想知道对以下两种方法的看法是什么,或者是否有其他更好的方法

一,。加入cdn_对象表

选择bp.*,从blog发布的cdno.id特色图片bp加入cdn\u对象cdno ON cdno.id=bp.featured\u图片,cdno.is\u deleted=0

优点:易于实现

缺点:每个查询都必须加入cdn_对象表

二,。使用垃圾台

创建另一个表cdn_object_trash,并在删除行cdn_对象时让代码“移动”该行cdn_对象,从而触发所有级联约束

Pro:允许关系规则执行其设计目的

缺点:设计不好?不确定

我的直觉告诉我应该使用is_deleted标志并相应地编写代码,但这是一个通用类,因此如果我可以在DB中配置该逻辑,我不希望每次都强迫开发人员编写连接


我希望我的情况/问题是清楚的,如果需要,请让我澄清任何要点。

您的第三个选择是设置合理的备份和保留计划,并使用级联删除。虽然我理解永远不删除任何内容的愿望,但遵守这一原则会迫使您在编程选择选项1中冗余,或者找出如何构建垃圾表以冗余存储信息选项2;您是使用数据的字符串表示构建单个表,还是创建模式的垃圾副本?。从长远来看,这两种选择似乎都需要做大量的工作


我使用过这两种选择的变体,如果这是表中唯一的选项,那么选项1更容易维护;但是,您必须非常勤奋地使用它,并且您必须确保未来的开发工作达到相同的标准。

谢谢,您一针见血-我想让未来[不太勤奋的]开发人员尽可能轻松地编写查询;我知道他们做得不好。我倾向于选项2,垃圾表实际上是对象表的副本。在课堂上多写几行来处理这个问题,我认为这是一个可以接受的折衷方案?我内心的理论家对这种折衷方案感到不寒而栗,因为它最终将引导您走上复制数据库中每个表的道路。您需要决定如何以及为什么推出数据,以及找到锁定它的方法,这样人们就不会在临时或未来的开发中使用它。我的实际一面认为,如果您的表数量有限,并且您有远见地构建一些维护功能,滚动超过某个日期的数据,等等,这是可行的。我听说,我也同意——无限期地存储数据会导致灾难。然而,我不打算将这种方法应用于每个表抱歉,我不是有意暗示,只是那些我想让用户能够回滚的表。其他一切都可以在常规备份系统中处理。
blog_post
id, title, body, featured_image
CONSTRAINT: featured_image = cdn_object.id ON DELETE SET NULL