给定一个数据库表,其中包含应用程序中多个用户可以看到的记录,标记为多个用户删除的记录的最有效方法是什么,而不实际删除记录本身(软删除)?
我已经考虑过以下示例,但我很想知道其他程序员会做什么。
+----------------+---------------+--------+
| id | data | active |
| (int, primary) | (varchar) | (int) |
+----------------+---------------+--------+
| 1 | foo | 1 | <-- this record is active (visible)
| 2 | bar | 0 | <-- no user can see this record
+----------------+---------------+--------+
管理用户可以将active
标志设置为0,以便有效地从所有用户的范围中删除该记录。
+----------------+----------------+
| entity_id | user_id |
| (int, primary) | (int, primary) |
+----------------+----------------+
| 1 | 100 | <--
| 1 | 150 | <-- Users 100, 150 and 37 can not see entity 1
| 1 | 37 | <--
+----------------+----------------+
有更有效的方法吗?
答案 0 :(得分:1)
您所描述的是如何以关系方式执行此操作。实际上它是一对多映射:您试图将一个项目(实体)的状态映射到许多(用户)。管理员覆盖状态的能力仅适用于实体,因此它应该在实体表中。
替代 - 非关系 - 方法可以是使用单个整数字段作为实体表中的位集,每个位表示单个用户的已删除实体状态。这将消除对entity_deleted_user表的需要(并且管理员可以简单地设置所有位以将其隐藏起来)但是这种方案有许多缺点(用户数量有限,没有参照完整性等)。