mysql - 我应该将子帖子标记为删除还是主帖子就足够了?
问题描述
我不确定这个问题是否过于主观,但如果有更适合它的论坛,请告诉我。
我有三个表Products
:Variations
和Colors
。
每个表都有该字段visibility
,如果设置为1
帖子可见,如果设置为0
隐藏。Products
是父表,它与子表有关系,Variations
并且是Colors
分开的。您可以从任何表格中删除帖子,但如果您从表格中删除帖子,则来自或的Products
任何相关帖子也将被视为已删除,无论其字段是否设置为或。Variations
Colors
visibility
1
0
如果产品被删除,最好扫描所有表并将所有内容标记为已删除,还是仅在父表中标记帖子就足够了?
我可以看到取消删除父帖子并使子表的历史完整无缺的好处,但您也可以争辩说它们是间接删除的,应该这样标记,可能会在查询时间上增加一些微秒,最后避免错误,如果加入或检查代码中某处缺少可见性字段。对于这两种方法,您还能想到任何其他论点吗?
解决方案
如果visibility
列确定是否删除了帖子,我认为您只能在父表中拥有它,Products
而在子表Variations
和Colors
. 如果与其他两个表之间存在关系,Products
您始终可以使用JOIN
并知道标记为已删除的内容。
例如,如果您有以下查询:
SELECT * FROM `Products` p
LEFT JOIN `Variations` v ON p.product_id = v.product_id
LEFT JOIN `Colors` c ON p.product_id = c.product_id
WHERE p.visibility = 1;
您将仅获取可见产品的数据,如果您想从子表中获取已删除的数据,您可以执行以下操作:
SELECT v.* FROM `Variations` v
LEFT JOIN `Products` p ON v.product_id = p.product_id
WHERE p.visibility = 0;
最后一个查询将为您Variations
提供标记为已删除的记录。
结论
使用语句时,您始终可以通过一对多关系中的父字段确定子字段的状态,JOIN
因此只需更新父表中的字段,我认为相同的字段在子表中是多余的。
推荐阅读
- r - 什么是相当于 R smartbind() 的 python/pandas
- groovy - 如何将 Groovy 闭包变量注入 Spock 模拟谓词参数?
- javascript - D3:无法单击 SVG 元素
- python - 如何获得浮士德发送原始回复
- c++ - 未初始化变量的危险是什么?
- reactjs - 我有两个表格,我想用下一个按钮将数据从第一个表格传送到第二个表格
- c# - 为什么我会收到 RemoteCertificateNameMismatch?
- amazon-web-services - AWS lambda 代理集成中的跨源资源共享
- function - 使用从 Flatlist 发送到子组件的函数
- string - Elixir 中的 "?\s" 是什么意思?