拍摄数据库表行的快照?

时间:2011-02-15 19:20:12

标签: php mysql cakephp cakephp-1.3

我想在MySQL表中快速拍摄一行。

原因是,如果有人购买了产品。我想拍一下该产品的快照来存储订单。

它必须是维护数据完整性的快照。如果我只是将产品分配给订单,如果产品将来发生变化,订单将显示这些变化。例如,如果价格发生变化,订单现在将加载新数据,并说它以新价格出售产品,而不是下订单时的价格。因此,需要将快照分配给订单。

我过去这样做的方式是有2个表,一个用于产品,一个用于产品的快照。快照将每列作为常规表加上额外的列,如order_id

我有一个脚本来拍摄快照,该快照会自动查看常规表中的字段,并尝试在相同的字段中插入快照表。

这种方法的最大问题是,如果我在常规表中添加了一列而忘记将相同的列添加到快照表中;脚本会尝试将数据插入到不存在的字段中并失败。

我也不喜欢有两张几乎相同的桌子。我想也许找出一种方法可以更好地使用一个表。


所以我想知道是否有一种我不知道的已知方法来解决这个问题?

我以前的项目没有使用框架,但是如果重要的话我的下一个项目将使用CakePHP。

2 个答案:

答案 0 :(得分:2)

我认为处理此问题的最佳方法是将“快照”信息滚动到orders_products表中。因此,如果您有订单,请将总价格,税金等信息存储在orders表格的一行中,并在order_id表格中引用orders_products。在orders_products表格中,您可以order_id, product_id, price, quantity, discount以及其他任何需要的内容。

答案 1 :(得分:0)

好像你以前没事。但是,您只需要进行更多测试,以确保不会忘记将新字段添加到快照表中。看起来像一个很容易做的基本测试。另一种方法是仅使用大文本字段,并将快照存储为XML。这样,无论架构是否更改,都可以存储快照。根据您要查询此数据的程度,它可能适用于您,也可能不适合您。

此外,您可能不想存储每个字段,因为它可能会占用额外的空间。例如,如果您拥有该项目的图像文件的位置,则可能不希望存储该项目,因为它可能在以后不重要。您可以尝试查询information_schema以查询快照表中的哪些字段,并仅复制可用字段。