【发布时间】:2017-09-28 21:57:14
【问题描述】:
在我的数据库中,我有几个表。一个是检查点表,它记录了用户选择完成他们的一个项目。此表包含自动创建的时间戳。每当用户完成他们的项目时,都会在检查点表中添加一个新行(这样我们也可以保留项目之前完成的历史)。
我还有其他几个带有时间戳的表(或者我也可以添加时间戳列的表),它们会在它们的表更改时自动更新。
是否有一种简单的方法可以判断自项目上次完成后是否有任何其他表更新了它们的数据?我不需要知道哪些表改变了数据,只是有表改变了数据。
例如,如果用户更改了其中一个表中的数据,我希望能够显示一条消息,表明他们的项目有未最终确定的数据。
我考虑过几种方法:
- 检查每个表以查看是否有任何时间戳比检查点表中的最新时间戳更新。
- 向主项目表添加一个额外的时间戳列(我已经有一个创建和更新的时间戳列)。大多数其他表直接或间接链接到此主项目表。将触发器添加到每个其他表以在其数据更改时更新此时间戳。我还不太确定如何为此正确设置适当的触发器。
- 创建仅包含 project_id 和时间戳列的新表。向其他表添加触发器,如选项 2 所示。
随着新模块的添加,我将向项目中添加更多表格,因此也需要一些易于扩展的表格。
这些方法中的每一种似乎都涉及很多步骤。
其中一种方法会比另一种更有效或更可行吗?还有另一种我没有考虑的方法吗?如果触发器是执行此操作的最佳方式,我将如何设置触发器?
我的表格的简化概览如下所示:
main_project_table
id
user_id (FK to user_table)
created_timestamp
updated_timestamp
checkpoint_group_table (users can choose which group to finalize their project too)
id
user_id (FK to user_table)
group_name
checkpoint_table (the table that records the finalized data and time of finalization)
id
checkpoint_group_id (FK to checkpoint_group_table)
project_id (FK to main_project_table)
project_finalized_timestamp
parent_table (several of these)
id
project_id (FK to main_project_table)
child_table (0 or more of these for each parent_table)
id
parent_id (FK to parent_table)
【问题讨论】:
-
您可以在采取任何其他操作之前添加一个检查以查看项目是否已完成,如果是,只需将一列设置为“未完成的数据”或其他内容,这样您就不会必须检查更多表,并且您只需在更新其他表之一中的数据时调用 1 个函数
-
这个^。只需在项目表中添加一个 is_finalized TinyInt 列。项目完成后,将其更新为 1。当有任何更改时,将其更新为 0。
-
为什么是 tinyInt?只需将其设为布尔值即可。
-
@TonyChiboucas MySQL 中没有真正的布尔数据类型。
-
@TonyChiboucas 是的,但是 bit(1) 与 MySQL 中的布尔值不同。关键字 boolean 实际上是 tinyint(1) 的别名。在旧版本的 MySQL 中,bit 也是 tinyint 的别名。