【发布时间】:2013-01-10 17:40:34
【问题描述】:
假设我有Item 和Tag,每个都有一个id 和name 列,还有一个Item_Tag_Map 表有一个复合Item.id, Tag.id 主键。
如果我想为Item 和Tag 实现一个历史表,这似乎相对简单——我可以添加第三列revision 和一个触发器以复制到ItemHistory 或TagHistory 表中id, revision 作为主键,operation(“INSERT”、“UPDATE”等)。由于我可能想“删除”项目,我可以采用以下两种方式之一:
- 在
Item或Tag上为is_active添加另一列,并且实际上永远不要删除任何行 - 删除行,但在历史表中将删除记录为
delete操作,并在Item或Tag插入时,确保从ItemHistory或@ 中获取最新的revision编号987654342@ table 与该项目,并将其设置为那个
第二个选项在我的嘴里留下了不好的味道,所以我可以使用第一个。毕竟,当我可以修改或更改其活动状态时,为什么我真的需要删除它?
现在,我在Item_Tag_Map 表上的历史表中遇到了同样的问题,但这一次,这两个选项似乎都没有那么吸引人。如果我选择为Item_Tag_Map 添加is_active,则查找标签是否映射到项目的逻辑从:
获取这些项目的所有 tag_mapping
到
获取这些项目的所有 tag_mapping WHERE is_active
映射的存在意味着映射存在的隐含想法消失了。未映射的 item-tags 集合不仅包括表中不存在的所有标签,还包括 is_active 为 false 的标签。
另一方面,如果我选择第二个选项,它仍然相当难看。
我相信人们之前已经多次遇到过这个问题,我有兴趣了解您是如何处理它的。
【问题讨论】:
标签: database database-design model many-to-many relational-database