Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拍摄数据库表行的快照?_Php_Mysql_Cakephp_Cakephp 1.3 - Fatal编程技术网

Php 拍摄数据库表行的快照?

Php 拍摄数据库表行的快照?,php,mysql,cakephp,cakephp-1.3,Php,Mysql,Cakephp,Cakephp 1.3,我想对MySQL表中的一行进行快照 原因是,如果有人买了一种产品。我想拍摄该产品的快照以存储订单 它需要是一个快照来维护数据完整性。如果我只是将产品分配给订单,如果将来产品发生变化,订单将显示这些变化。例如,如果价格发生变化,订单现在将加载新数据,并表示它以新价格销售产品,而不是以下订单时的价格销售产品。因此,需要将快照分配给订单 过去我这样做的方式是有两个表,一个用于产品,另一个用于产品快照。快照的每一列都作为常规表加上额外的列,如order\u id 我有一个脚本来拍摄快照,该脚本自动查看常

我想对MySQL表中的一行进行快照

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

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

过去我这样做的方式是有两个表,一个用于产品,另一个用于产品快照。快照的每一列都作为常规表加上额外的列,如
order\u id

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

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

我也不喜欢两张几乎完全相同的桌子。我想也许找到一种方法,将一张桌子同时用于两个目的可能会更好


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


我以前的项目没有使用框架,但我的下一个项目将使用CakePHP(如果有必要)。

我认为最好的处理方法是将“快照”信息滚动到
订单\u产品表中。因此,如果您有订单,请将总价、税费等信息存储在
订单
表的一行中,并在
订单产品
表中引用该
订单id
。在您的
orders\u products
表中,您可以有
order\u id、product\u id、价格、数量、折扣
以及您需要的任何其他信息。

似乎您以前的信息还可以。但是,您只需要进行更多的测试,以确保不会忘记将新字段添加到快照表中。似乎是一个简单的基本测试。另一种选择是只使用一个大的文本字段,并将快照存储为XML。这将允许您存储快照,无论模式是否更改。根据您希望查询此数据的程度,它可能对您有用,也可能不适用


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

+1非常好的建议,这是对我的设计的明确改进。不过,在我给出答案之前,我会等着看是否还有其他好的建议。谢谢真正地将xml字符串存储在关系数据库中不是一个好主意(tm)——如果按照这种方式,将序列化数组存储到文本字段中。更好的做法是将明显的销售行项目数据存储在orders\u products表的联接表中,并为联接表编写有效的模型。记住在你的人际关系中使用“with”键,你应该有一个好的开始。(我将提交一个新的答案,但这与treeface所建议的想法相同)MS认为在数据类型中添加一个整体以在字段中存储XML足够有用。MySQL还添加了许多查询和处理存储在数据库字段中的XML数据的功能。不管这是否是一个“好主意(TM)”,很多人似乎都在这样做,而且它似乎以一种非常好的方式解决了很多人的问题。根据MSSQL文档,将关系数据作为字符串存储在另一个关系存储层中被MS认为是一件坏事。仅仅因为他们让你这么做并不意味着你应该这么做——只是因为有足够多的人决定支持它。好吧,很明显,他们当时有内部冲突。因为一方面,文档说不应该将关系数据作为字符串存储在数据库字段中。另一方面,为了明确地将关系数据作为字符串存储在数据库字段中,在设计整个特性、添加一个全新的数据类型和一系列函数的过程中,它们需要进行非常有目的的操作。因此,尽管在文档中的某个地方,这可能被列为一个坏主意,但他们确实花了很多精力来帮助您做到这一点。