我有一张叫做“预订”的表格.该表包含表示针对特定服务进行预订的数据,具有许多变量.

前一段时间,我遇到了一个我目前的数据结构的问题,其中任何影响时间,日期或价格的更改将影响其他相关的财务记录,日期的预订列表等.

我当时的解决方案是创建一个修改表来跟踪对预订所做的任何更改.然后,每当预订模型被要求退回预订时,它将添加修改(在afterFind()蛋糕回调),并提供最新版本的预订,这样的话(借口绘画):

当您要求预订模式返回预订#1234时,此方法工作正常.它返回最新的预订表示,包括所有修改(彼此分层),包括包含所有修改的数组和原始预订数据供参考.

我的问题是,我最近意识到,我需要能够使用自定义条件查询此模型,如果其中一个条件在其中一个修改中实现,则结果将不匹配,因为模型正在搜索原始记录而不是终于呈现的记录.示例,我查询模型返回abc是蓝色(不是灰色)的行:

在该示例中,模型直接看到abc为蓝色的行的原始数据,并且不返回此结果,因为蓝色值位于在找到原始结果之后附加的修改.

我现在所做的是将预订模型的beforeFind()回调查询到寻找符合给定条件的修改,加入预订以确保任何其他条件仍然匹配.当它返回上面的示例中的蓝色时,它将该结果作为类属性存储在数组中,并继续使用常规的find(),但不包括预订的ID被返回(因为我们已经找到更新的验证).然后,它们将它们合并在一起,再次对afterFind()进行排序.

这是有效的,虽然这是一个更长的时间,我希望.

毕竟,我已经意识到,在这个应用程序的其他部分,有手动加入预订表和搜索预订的模型.所以现在我需要一种方法可以将所有这些手动连接的修改整合到MySQL中,而不影响原始数据,最好不要改变我的代码太多.

我的想法是,我需要删除手动联接,并建立一个模型关联.当我查询说客户型号有多少预订(对每个预订应用修改)时,预订模型的beforeFind()和afterFind()是否仍然运行?

我的另一个选择是通过删除修改中可能包含的任何标准,从MysqL返回更多的行,然后使用PHP根据搜索条件过滤结果.这个选项吓倒了我一点,因为结果集有可能是巨大的没有这个标准…

如何实现这个数据结构?我的主要要求仍然是我不想更改原始的预订记录,而是添加修改记录,但是我需要能够通过模型来查询预订(包括修改).

我想尝试尽可能多地保持这种整合的背景,所以我不必经历我的整个应用程序来更改n个查询,如下所示:

$get_blue = $this->Booking->find('all',array(
    'conditions' => array(
        'Booking.abc' => 'blue'
    )
));

我想要隐含地包含对预订的任何修改,以便在上述查询中返回最新的预订.

另一个问题是当预订模式手动加入搜索查询时,如下所示:

$get_transactions_on_blue_bookings = $this->Transaction->find('all',array(
    'joins' => array(
        array(
            'table' => 'sql_bookings_table',// non-standard Cake format,I kNow - it's an example
            'alias' => 'Booking','type' => 'LEFT','conditions' => 'Booking.booking_id = Transaction.booking_id'
        )
    ),'conditions' => array(
        'Booking.abc' => 'blue'
    )
));

您可以看到,上述查询将不包括我上面的MSPaint示例中的修改,因为它是手动加入sql中的表(修改集成在Booking模型的before和afterFind()回调函数中).

对此的任何帮助将不胜感激.

编辑

我知道这已经够久了,但是我想我补充说,我想跟踪这些变化而不是更新原始记录的原因是财务方面不能改变,因为它会影响报告.

到目前为止,我可以看到的最简单和最简单的解决方案是在所有情况下直接对原始预订进行修改,除非它会影响财务信息,这仍然被修改(因为我目前不需要根据这个信息进行搜索) ).

这听起来像是要实现一个 Temporal Database.时间支持是ANSI / ISO sql:2011标准的主要补充之一. MysqL(像大多数RDBMS一样)落后于标准.将时间数据库视为CVS / SVN / Git的DBMS等价物.

相比之下,我们使用的没有时间特征的传统数据库可以称为当前数据库.

在当前数据库中,如果您尝试实现时间支持,则可能会通过不同的方法在许多方面失败:

>一表方法.当您需要进行修改时,您可以对原始记录进行更新,除非您有某种本地触发/审计逻辑,否则历史记录不存在.即使你有一个审计/更改日志,你必须做一些丑陋的挖掘重建变更历史.
>双表方法.而不是就地进行修改,您可以将数据分成两个表,一个是基数/原始记录(例如预订),另一个表用于更改/修改/增量.那么至少你保留原始数据,但是再次需要编写复杂的逻辑来查看原始数据并进行修改.如果您只想要应用一些修改,它会变得更糟.
>预先计算的结果表方法.您保留3个或更多表:基本记录,修改以及尝试始终具有结果的表(保持最新的基本修改).祝你好运,编写触发器和程序来做这个计算,每当你做INSERT,而天堂帮助你,如果需要UPDATE或DELETE.该设置是脆弱的,可能会失去同步,例如死锁和回滚.如果您不使用触发器/程序在数据库中执行此操作,则可以尝试在应用程序代码中实现其计算结果,但运行良好,并且可能会在多线程消费者中受到困扰.而且,您仍然无法轻松访问结果,只能进行一些修改.

结论:如果您不限于MysqL,那么您应该考虑使用具有内置时间支持的数据库.否则,你将重新实施轮子.

php – 数据更改的有效管理的更多相关文章

  1. ios – 数组的数组.仅存储副本

    我需要存储一个Int数组的数组,用于有序重复.例:>给定数组:mainArray=[7,7,3,2,1,5,5]现在我需要创建一个int数组的数组.例:这是我有的:解决方法您可以使用reduce方法.减少工作如何?reduce将封闭中的逻辑应用于空的2D数组的整数和数字的第一个elm.然后再次应用上一次迭代的结果和第二个整数数组…if是否检查在结果中添加的最后一个数组中的数字是否等于当前检查的整数.如果这样,那个整数被添加到该数组.否则,只会添加一个仅包含新整数的数组.测试

  2. Swift:Generators 与 Sequences 浅析

    前言Generators与Sequences构成了Swift式循环。Generators提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。这时候Generators就可以派上用场了。举个倒序索引的generator:好处是啥好处是啥,我的总结是把一个很抽象遍历模式使用Generators的方式剥离出来,当你对当前的迭代循环方式不爽的时候只需要修改一下当前的这个generator。SequencesGenerators在循环过程中每个元素提供的服务是一次性的。

  3. 再探Swift基础

    基础tuplesstringsnumericfor循环while循环if条件switchoptionalarraydictionaryset

  4. swift排序算法和数据结构

    vararrayNumber:[Int]=[2,4,216)">6,216)">7,216)">3,216)">8,216)">1]//冒泡排序funcmaopao->[Int]{forvari=0;i

  5. Arrray 中的map和filter 函数的使用

    swift中的Array提供了两个很方便的函数map和filter使用map可以建立一个从A数组到B数组的一个映射,例如:我们给数组的每个元素后添加一个testvararray=["1","2","3"];printlnfuncfx->String{returnstr+"test"}我们还可以使用filter函数按条件过滤一些不符合条件的数组例如:vararray=[1,4,10];array=array.filterprintln//结果[4,10]另外一种写法:array.filter

  6. Swift 2.0学习笔记Day 17——Swift中数组集合

    数组中的集合元素是有序的,可以重复出现。varstudentList1:ArrayvarstudentList2:[String]声明的Array还不能用,还需要进行初始化,Array类型往往在声明的同时进行初始化。示例代码如下:varstudentList1:Array=["张三","李四","王五","董六"]varstudentList2:[String]=["张三","董六"]letstudentList3:[String]=["张三","董六"]varstudentList4=[String](

  7. Swift高级开发语言基础

  8. Swift关于Array的探讨

    当我们想向Array添加不同数据类型的元素时,可以这样做:这样我们便可以向Array添加任何数据类型的元素了,但是如果我们希望Array中只能添加特定几种类型的元素怎么办呢?这里提供一种思路:

  9. 《从零开始学Swift》学习笔记Day 17――Swift中数组集合

    数组中的集合元素是有序的,可以重复出现。,Array类型往往在声明的同时进行初始化。整个遍历过程与循环分不开,可以使用for-in循环。下面是遍历数组的示例代码:运行结果如下:张三李四王五Item1:张三Item2:李四Item3:王五欢迎关注关东升新浪微博@tony_关东升。

  10. Swift学习 数组

    1、计算数组的长度count:计算数组的长度2、判断数组是否为空isEmpty:判断数组是否为空3、在数组尾部添加元素append:在数组尾部添加元素4、通过下标修改数组元素的值5、数组的插入insert:通过insert和下标向数组中插入元素6、数组的删除7、数组的遍历8、数组的拼接

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部