Php mysql历史数据和记录id

Php mysql历史数据和记录id,php,mysql,database,transactions,Php,Mysql,Database,Transactions,我正在为mysql中的transactions表设置一个具有历史数据需求的应用程序的新部分。最初在旧版本中,事务不是历史事务,其结构如下: id|buyerid|prodid|price|status 和其他字段,id在访问事务详细信息页面的链接中引用,并在整个应用程序的其他表中用作外键,以引用用于各种目的的特定事务 现在的要求是回答报告问题,如显示2014年2月具有特定状态的所有交易,以及2014年2月的交易是什么样子的 我目前正在测试的新设计如下: id|buyerid|prodid|pr

我正在为mysql中的transactions表设置一个具有历史数据需求的应用程序的新部分。最初在旧版本中,事务不是历史事务,其结构如下:

id|buyerid|prodid|price|status
和其他字段,id在访问事务详细信息页面的链接中引用,并在整个应用程序的其他表中用作外键,以引用用于各种目的的特定事务

现在的要求是回答报告问题,如显示2014年2月具有特定状态的所有交易,以及2014年2月的交易是什么样子的

我目前正在测试的新设计如下:

id|buyerid|prodid|price|status|active|start_date|end_date
当active用于指示最新记录时,开始是在创建记录时,没有要修改的记录,而不是填充结束日期,并创建具有相同详细信息和修改的新记录

现在的问题是-如何处理事务id字段?因为在这个新的设计中,它更多的是一个历史id,不能用于整个应用程序的外键,因为它将随着每次更新而改变

我可以想出两个选择:

在tid的主事务表中创建一个单独的表、仅包含一列的事务\u id、主键自动增量tid和外键列-每次创建一个全新的事务时,插入ids表,并使用tid的id在整个系统中跟踪此特定事务

buyerid和prodid的组合在我的应用程序中始终是唯一的,没有买家可以两次获得相同的产品


第二种解决方案更好吗?有谁知道更好的方法来处理这个问题吗?

你正在努力实现的目标被称为。 考虑改变事务状态的事件,而不是及时跟踪状态本身。 您的事务仍然具有自己的主键,您可以应用每个事件重建当前或过去的状态


我还建议您开始编写业务模型,然后再考虑持久性以及将其映射到数据库的最佳方式。

第二种解决方案看起来更好,尽管我会说您的问题中有很多模糊之处

我是说第二个解决方案更好,因为您在解决方案1中所讨论的事务ID表基本上是冗余的。它没有解决任何问题。即使事务id在事务表中重复自身,也不意味着您需要一个单独的表来生成id并使其成为PK-FK关系。很可能您仍将按用户id和产品id而不是按事务id查询数据

基本上,您需要的是某种审计历史记录表,在该表中,您为完成的每个操作/事务/修改插入一条记录,并捕获一些基本细节,如-用户名、日期/时间、旧值、新值等。您不需要状态或开始日期和结束日期列。一旦一条记录被插入到这个审计历史记录表中,它就再也不会被触动了


您必须仔细设计您的报告。

考虑到前面的两个答案,以下是我将采用的解决方案:我的应用程序中的所有数据更新都通过一个单独的函数完成,该函数已设置为审核我选择的特定字段,因此,我将在其他事务中标记要审核的事务状态。审核表的表结构与此类似:

|id|table|table_id|column|old_val|new_val|who|when|
只是通过对象id而不是简单的表名有一点更高级的对象映射。然后,我可以将这些数据连接到主、正常而非历史事务表中,以提供所需的报告