当数据来自两个表时,如何识别要删除哪个表的记录?

分享于2022年07月17日 database mysql php 问答
【问题标题】:当数据来自两个表时,如何识别要删除哪个表的记录?(How to identify which table to delete a record when data coming from two tables?)
【发布时间】:2022-01-23 09:23:07
【问题描述】:

我有两张表,其中保存了一些相同类型的信息。一张表已批准信息,另一张表包含待批准(等待批准)数据。我从两个表中获取数据并显示在同一个视图中。因此,用户将看到两个表中的数据。用户可以删除这些记录。但是在删除时,我很难找出应该删除哪个表。

假设,table1(已批准信息),table2(待处理信息)

table1

id | name  | description | creator |
-----------------------------------
10 | test1 | N/A         | 100     |
11 | test2 | N/A         | 100     |
12 | test3 | N/A         | 101     |
13 | test4 | N/A         | 200     |


table2

id | name  | description | creator |
-----------------------------------
10 | test1 | N/A         | 105     |
11 | test2 | N/A         | 103     |
12 | test3 | N/A         | 106     |
13 | test4 | N/A         | 202     |

table1 有一条 id 为 10 的记录;并且 table2 在该表中有一条 id 为 10 的记录。 Id 是两个表的主键。两条记录都将显示给用户。假设用户想要删除来自 table2 的与 id 12 相关的记录。所以我想从 table2 中删除该记录。但是我怎样才能确定要删除该记录的表。因为我不能使用 id 来计算表格。我试过使用某种附加的数据属性 来自 table2 的数据以区分它们。但是任何人都可以通过检查来更改它们。那么解决这个问题的正确方法是什么?

  • 您应该在 HTML 中添加一些内容来指示该行来自哪个表。您可以为此使用隐藏输入。
  • @Barmar 是的...我使用了隐藏的输入字段。但问题是任何人都可以检查它并更改该值然后提交。不是问题吗?
  • 一个合适的数据库表应该包含 status 列,该列具有 pending/approved/rejected 等值。
  • 为什么会有问题?如果他们不应该能够从另一个表中删除该行,则需要添加验证以防止这种情况发生。
  • 你认为一张表有 5 列(id | name | description | creator | status)相对于两张表中有 8 列是浪费空间吗?

【解决方案1】:

在任何情况下,在任何系统上,都有两个具有相同列的表是有意义的。这应该是数据库设计的首要规则之一。更重要的是,您发现自己很难维持这样的设计。我在对代码零热爱的情况下开发的遗留系统上看到了这一点。在未来,这将变成一个雪球。您应该尽快更改它。

状态栏

实体或资源的状态是经典要求,通常用一个小列实现,称为:状态、标志、模式等。在您的情况下,它可能具有以下值(@BhaumikPandhi 评论):

  • 待处理/已批准/已拒绝
id | name  | description | creator | status |
--------------------------------------------
10 | test1 | N/A         | 100     | pending|

如果您担心数据库优化,您可以在您的文档中使用 tinyint 与这些等效项:

  • 1 = 待处理
  • 2 = 批准
  • 3 = 拒绝

状态表

您可以保留您的第一个表名为 record

id | name  | description | creator |

并创建另一个名为 record_status 的 2 列,其中 record_id 是 record 表的 FK

record_id | status |

无论如何,状态列是满足您要求的最简单的经典方法。