数据库:将实体(记录)标记为已删除某些用户

时间:2014-06-09 09:34:36

标签: mysql database-design relational-database

给定一个数据库表,其中包含应用程序中多个用户可以看到的记录,标记为多个用户删除的记录的最有效方法是什么,而不实际删除记录本身(软删除)?

要求:

  • 多个用户应该能够将记录标记为已删除
  • 当用户A将记录标记为已删除时,用户B,C,D ......仍应能够看到它,直到将其标记为已删除为止
  • 管理用户应该能够将记录标记为已删除,以便其他人不再显示该记录。

我已经考虑过以下示例,但我很想知道其他程序员会做什么。

表:实体

+----------------+---------------+--------+
| 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_deleted_user

+----------------+----------------+
| entity_id      | user_id        | 
| (int, primary) | (int, primary) |
+----------------+----------------+
|              1 |            100 | <--
|              1 |            150 | <-- Users 100, 150 and 37 can not see entity 1
|              1 |             37 | <--
+----------------+----------------+

有更有效的方法吗?

1 个答案:

答案 0 :(得分:1)

您所描述的是如何以关系方式执行此操作。实际上它是一对多映射:您试图将一个项目(实体)的状态映射到许多(用户)。管理员覆盖状态的能力仅适用于实体,因此它应该在实体表中。

替代 - 非关系 - 方法可以是使用单个整数字段作为实体表中的位集,每个位表示单个用户的已删除实体状态。这将消除对entity_deleted_user表的需要(并且管理员可以简单地设置所有位以将其隐藏起来)但是这种方案有许多缺点(用户数量有限,没有参照完整性等)。