有效管理数据变更

2024-01-29

我有一张名为 Bookings 的表。该表包含表示针对特定服务进行的预订的数据,具有许多变量。

不久前,我遇到了当前数据结构的问题,即影响时间、日期或价格的预订的任何更改都会影响其他相关的财务记录、日期的预订列表等。

我当时的解决方案是创建一个修改表来跟踪对预订所做的任何更改。然后,每当 Booking 模型被要求返回预订时,它都会添加所做的修改(在afterFind()Cake 回调)并呈现最新版本的预订,如下所示(请原谅 Paint 绘图):

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

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

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

我现在所做的是将查询放入beforeFind()回调 Booking 模型以查找与给定条件匹配的修改,加入预订以确保任何其他条件仍然匹配。当它返回上面示例中的蓝色时,它将结果存储在数组中作为类属性,并继续常规操作find(), but excludes该预订的 ID 不会被退回(因为我们找到了它的更新版本)。然后它将它们合并在一起,再次对它们进行排序等afterFind().

这是可行的,尽管它比我希望的要冗长一些。

毕竟,我意识到在这个应用程序的其他部分,有一些模型手动加入预订表并搜索预订。因此,现在我需要一种方法,能够将修改直接合并到 MySQL 中的表的所有手动联接中,而不影响原始数据,并且最好不要更改太多代码。

我的想法是,我需要删除手动连接并创建模型关联。会不会beforeFind() and afterFind()当我查询具有许多预订的客户模型(将修改应用于每个预订)时,预订模型的仍然运行?

我的另一个选择是通过删除修改中可能包含的任何条件,从 MySQL 返回比所需更多的行,然后使用 PHP 根据我的搜索条件过滤结果。这个选项让我有点害怕,因为如果没有这个标准,结果集可能会很大......


我怎样才能实现这个数据结构?我的关键需求仍然是我不想更改原始 Booking 记录,而是在上面添加 Modification 记录,但我需要能够通过模型查询预订(包括修改)。

我想尝试尽可能多地将这种集成保留在幕后,这样我就不必遍历整个应用程序来进行更改n类似这样的查询数量:

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

我希望能够隐式包含对预订所做的任何修改,以便在上述查询中返回最新的预订。

另一个问题是当 Booking 模型手动连接到搜索查询时,如下所示:

$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 中手动连接表(修改集成位于before and afterFind()Booking 模型的回调函数)。

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

Edit

我知道这已经足够长了,但我想我应该补充一点,我想跟踪这些更改而不更新原始记录的原因是金融的方面不能改变,因为它会影响报告。

到目前为止,我能看到的最快、最简单的解决方案是在所有情况下直接对原始预订应用修改,除非它影响财务信息,财务信息仍被跟踪为修改(因为我目前不需要根据此信息进行搜索) )。


听起来你正在尝试实现一个时态数据库 http://en.wikipedia.org/wiki/Temporal_database。时态支持是 ANSI/ISO SQL:2011 标准的主要补充内容之一。 MySQL(像大多数 RDBMS 一样)落后于标准。将时态数据库视为相当于 CVS/SVN/Git 的 DBMS。

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

In a 当前数据库,如果您尝试实施临时支持,则可能会使用不同的方法以多种方式失败:

  • 单表方法。当您需要进行修改时,您可以这样做UPDATEs在你的原始记录上,除非你有某种本土的触发/审计逻辑,否则历史记录是不存在的。即使您有审核/更改日志,您也必须进行一些丑陋的挖掘才能重建更改历史记录。

  • 两表方法。您不是就地进行修改,而是将数据分成两个表,一个包含基本/原始记录(例如预订),另一个表包含更改/修改/增量。那么至少您可以保留原始数据,但您必须再次编写复杂的逻辑来查看经过分层修改的原始数据。如果你只想some所应用的修改。

  • 预先计算的结果表方法。您保留 3 个或更多表:基本记录、修改以及一个试图始终拥有结果的表(保持最新的基本记录和修改)。祝您无论何时都能编写触发器和程序来执行此计算,祝您好运INSERTs,如果有的话,天堂会帮助你UPDATE or DELETE是需要的。该设置很脆弱,可能会不同步,例如死锁和回滚。如果您不在数据库中使用触发器/过程执行此操作,您可以尝试在应用程序代码中实现结果计算,但祝您好运 - 对于多线程使用者来说,它可能会变得丑陋。尽管如此,您仍然无法轻松获得结果some应用修改。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有效管理数据变更 的相关文章

  • 服务器响应中的“连接:保持活动状态”

    我正在尝试建立从 Silverlight 应用程序到 Apache 服务器托管的 PHP 页面的 HTTP 持久连接 即无需为每个 HTTP 请求创建新的 TCP 连接 为此 我需要网络服务器发送其 HTTP 响应 并将 Connectio
  • 我应该定义索引(A)和索引(B),还是索引(A,B),或者两者都定义?

    在我的表中 我有两个密切相关的列 A 和 B 我应该考虑哪些因素来决定是否创建 索引 A 和索引 B 索引 A B 以上两者 如果我 仅使用类似的查询where A 5 and B 10 并且从不喜欢where A 5 也可以使用类似的查询
  • 未找到“MongoId”类(带有 MongoDB Doctrine 的 Zend 框架)

    我目前正在尝试将 MongoDB 与 ZendFramework 中的 Doctrine 集成 我做了很多教程 在 StackOverflow 或其他地方 但没有任何效果 我一步步按照教程进行操作 http www bigwisu com
  • PHP:STR 替换为链接

    我有这个 PHP 聊天框 如果我在聊天框中键入链接 它不会将其显示为链接 我如何使用 STR 替换来执行此操作 它应该响应诸如 http http com nl www www 之类的内容 我的其他 STR 替换行如下所示 bericht
  • json_encode 创建格式错误的 JSON 数据?

    我有一个 codeigniter 应用程序将一些数据从数据库返回到视图 我正在尝试将其作为 json 数据发送回来 问题是返回的数据格式错误 它看起来像这样 2 5 Admin1 2 10 Admin2 当我在 jsonlint com 上
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • 正则表达式替换混合数字+字符串

    我想删除所有包含数字的单词 示例 LW23 London W98 String 从上面的字符串中我唯一想保留的是 London String 这可以用正则表达式来完成吗 我目前正在使用 Python 但 PHP 代码也很好 Thanks E
  • MySQL:“您的 SQL 语法错误...靠近键...”? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我发现了一个非常酷的用于丢失密码的脚本 但是这一行给我带来了问题 r mysql query INSERT INTO keys u
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • 计算轮班工作时间并检测

    我有个问题 我的英语很差 我需要用PHP做一个加班计算 已经有一个代码可以实现这一点 但当工作时间超过2天时 计算就会出错 工作开始 2018 09 09 13 43 工作结束 2018 09 11 07 13 结果 07 18 04 00
  • PHP OOP 静态属性语法错误 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 为什么不
  • 如何使用多个数据库设置 symfony 3 学说迁移?

    我在验证和更新模式时努力让 symfony doctrine 排除数据库视图 我第一次尝试没有教条迁移 看到这个问题 https stackoverflow com questions 46775200 symfony 3 doctrine
  • 将自定义参数传递给 Symfony2 中的自定义 ValidationConstraint

    我正在 Symfony2 中创建一个表单 表格只包含一个book字段允许用户在列表中进行选择Books实体 我需要检查是否选择了Book属于Author我的控制器里有 public class MyFormType extends Abst
  • Slim 3 - 斜杠作为路由参数的一部分

    我需要使用可以包含斜杠 的参数来编写 URL 例如 经典的 hello username 路线 默认情况下 hello Fabien将匹配此路线 但不匹配 hello Fabien Kris 我想问你如何在 Slim 3 框架中做到这一点
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • Apache 2.4.9 在启用 ssl 模块并设置 ssl 证书后失败

    Apache 在尝试设置 ssl 证书后抛出以下错误 ssl emerg pid 30907 AH02572 Failed to configure at least one certificate and key for localhos
  • 由于未定义符号,PECL solr 未加载:curl_easy_getinfo

    我正在尝试加载 PECL solr 扩展 我尝试使用 pecl install solr 并下载并使用 phpize configure make 来安装它 在这两种情况下 扩展安装时都没有错误 但在 apache 重新启动后 或在命令行上
  • 使用 PHP 创建图表并导出为 PDF

    我正在寻找有关使用 PHP 创建图表的建议 我还希望能够将这些图表导出到 PDF 文档 我目前正在使用谷歌图表 但我不喜欢将我的所有信息发送到谷歌的想法 我更喜欢自己的托管解决方案 我见过很多 Flash 解决方案 但我不知道有什么方法可以
  • 准备好的语句需要 0 个参数,给定 1 个参数..,使用 php 手册示例 [重复]

    这个问题在这里已经有答案了 我直接从 php 手册示例中获取了这个 它几乎与我需要的相同 但我仍然收到此错误 有人可以告诉我我错过了什么吗 stmt link gt prepare SELECT obitBody Photo FROM tn
  • PHP 用星号替换所有字符

    假设我有一个字符串形式的密码 password thisisaplaintextpassword 我怎样才能把它变成下面的样子 password 我想通过电子邮件向用户发送他们的帐户详细信息 但不想发送整个内容 Use 字符串重复 http
  • 命名约定(单数或复数名称类)

    我有一个class对商店进行建模 所以它具有以下属性 name 描述 address phone etc 我应该命名它吗ShopInfo or 商店信息 任何链接到命名约定 如果你有一个类的对象 它只是信息for one店铺 该对象描述了一
  • iOS Swift:从 CNContactProperty 中获取用户选择的电话号码作为字符串[重复]

    这个问题在这里已经有答案了 正如标题所示 在我使用 swift 的 iOS 应用程序中 我有一个 CNContactProperty 对象 我想从中提取电话号码作为字符串 用户从中选择联系人后 CNContact 属性通过委托协议函数从标准
  • 我该如何清理这个 lambda?

    我有一个在多个 LINQ 查询中多次使用的表达式 因此我将其分离到它自己的返回该表达式的方法中 该函数的 lambda 部分看起来有点混乱 有人想尝试重构它并使其更具可读性和 或更小吗 private Expression
  • 使用不同的替换顺序替换字符串中与单个模式匹配的多个位置

    Using stringr包中 很容易以矢量化方式执行正则表达式替换 问题 我该如何执行以下操作 替换中的每个单词 hello world your make world hello pos 不同的替代品 例如数量不断增加 1 2 3 4
  • Eclipse RCP 4 与 NetBeans Platform 8 对比:选择什么?

    我即将为我的公司启动一个相当大的应用程序 由于它必须是跨平台的 我们指向 Java 本来会喜欢 C 但探索了 Xamarin 生态系统 而 Mac 部分似乎远远落后于休息包 现在 我正在将 Netbeans 8 和 Eclipse 4 作为
  • 如何通过蓝牙 android 发送/接收字符串到另一部 android 手机

    在我的 Android 应用程序中 我想通过蓝牙将字符串从一台设备发送到另一台设备 可用设备显示在列表视图中 我想在不配对的情况下发送字符串 我无法在设备之间建立连接 任何人都可以帮助我建立连接并发送字符串 我有很多示例 但无法弄清楚文件传
  • 如何在 emacs 艺术家模式下在矩形内写入文本?

    我正在 emacs 中学习艺术家模式 发现它非常有趣 我想创建形状并在其中写入文本 就像我们可以使用其他可以绘制形状的软件一样 但是 当我在矩形内键入一些字符时 形状会变形 垂直线会移动一些字符 Please see attached im
  • zend smtp 邮件在 100 多封邮件后崩溃

    在发送新闻通讯类的邮件时 我遇到了这个奇怪的问题 在 for 循环中 我循环访问数据库中的所有用户 并尝试向他们发送一封包含一些基本信息的 HTML 邮件 现在的问题是 前 200 封左右的邮件运行良好 但随后脚本崩溃并给出以下错误 War
  • 使用 NSDate() 快速创建未来日期

    我收到错误 调用中缺少参数 编码器 的参数 以下代码 var components NSDateComponents components setValue 1 forComponent NSCalendarUnit CalendarUni
  • Pygame 事件队列

    我想知道是否有一种使用方法poll or get 而不从队列中删除事件 在我的游戏中 我检查不同位置的输入 不仅在主循环中 有时我需要在不同位置检查相同的事件 但是当我检查它时 它会将其从队列中删除 我尝试使用peek 但问题是我无法获得与
  • Zend ACL 动态断言

    我想限制我的用户只能编辑 删除他们添加的评论 我在 youtube 上找到了一个名为 intergral30 的人的示例 并按照他的指示进行操作 现在我的管理员帐户可以编辑 删除所有内容 但我的用户无权访问他自己的评论 这是代码 资源 cl
  • .h 文件有什么意义?

    我知道 h 文件应该有 类声明 函数原型 和外部变量 对于全局变量 但让它成为一个有什么意义吗 h文件 我尝试重命名我的 h文件到一个 c文件 它仍然有效 We can name our file to be anything but we
  • 为什么我不需要引用“System.dll”来使用“System”命名空间?

    我正在处理指定 不要使用任何外部库 的作业 所以我创建了一个 C 应用程序 我做的第一件事就是默认删除所有 dll 的引用 包括 System dll 但是 我仍然可以将其添加到我的代码中 using System using System
  • PostgreSQL全文搜索和保留字,保留一些单词

    我正在使用 Postgresql 和英语字典进行完整的测试搜索 当我想接收带有一些英语单词的记录时 我得到了真实的结果 And so SELECT id FROM table1 WHERE ts vector1 to tsquery it
  • BlockingCollection(Of T) 的目的是什么

    我试图在 NET 4 上新的并行堆栈的上下文中理解 BlockingCollection 的用途 The MSDN http msdn microsoft com en us library dd267312 VS 100 aspx文档说
  • 迭代器(不是迭代器)上的 Lambda 迭代

    我经常读到在迭代器上调用 Lambda 函数是不可能的 直到现在我也一直抱着这样的信念 然而 阅读 Franco Ponticelli 和 Lee McColl Sylvester 所著的 Professional Haxe 一书 了解如何
  • 如何使用 CoreData 执行计算查询

    我有 T SQL 背景 所以 CoreData 的东西对我来说有点新鲜 我正在制作一个应用程序原型 该应用程序最终将使用 MS SQL 后端 Web 服务进行查询 在我的后端 我的 t sql 查询将是这样的 SELECT SQRT SQU
  • “关闭变量会导致性能稍差”。如何?

    在回答 SO 问题时 我被告知我的解决方案将引入变量闭包 因此它的性能会稍差 所以我的问题是 怎么会出现倒闭呢 它将如何影响性能 这里是question https stackoverflow com questions 24696991
  • 有效管理数据变更

    我有一张名为 Bookings 的表 该表包含表示针对特定服务进行的预订的数据 具有许多变量 不久前 我遇到了当前数据结构的问题 即影响时间 日期或价格的预订的任何更改都会影响其他相关的财务记录 日期的预订列表等 我当时的解决方案是创建一个