假设我有Item
and Tag
,其中每个只有一个id
andname
列,以及一个Item_Tag_Map
具有复合Item.id, Tag.id
主键的表。
如果我想为Item
and实现一个历史表Tag
,这似乎相对简单——我可以添加第三列revision
和一个触发器以复制到一个ItemHistory
orTagHistory
表中,并id, revision
作为主键和operation
(“INSERT”、“UPDATE”等)。由于我可能想“删除”项目,我可以采用以下两种方式之一:
Item
在或Tag
上添加另一列is_active
,并且实际上永远不会删除任何行- 删除行,但将删除记录在历史表中作为
delete
操作,并在Item
或Tag
插入时,确保从或表中获取该项目的最新revision
编号,并将其设置为ItemHistory
TagHistory
第二种选择在我的嘴里留下了不好的味道,所以我可以使用第一种。毕竟,当我可以修改它或改变它的活动状态时,为什么我真的需要删除它呢?
现在,我在桌子上的历史表上遇到了同样的问题Item_Tag_Map
,但这一次,这两个选项似乎都没有那么吸引人。如果我选择添加一个is_active
for Item_Tag_Map
,找出一个标签是否映射到一个项目的逻辑从:
获取这些项目的所有 tag_mapping
至
获取这些项目的所有 tag_mapping WHERE is_active
映射的存在意味着映射存在的隐含想法消失了。未映射的项目标签集不仅包括表中不存在的所有项目标签,还包括is_active
为假的项目标签。
另一方面,如果我选择第二个选项,它仍然相当难看。
我敢肯定人们以前曾多次遇到过这个问题,我有兴趣了解您是如何处理它的。