我需要解析API路由中的内容并插入到MySQL数据库中。解析内容的目的是将数据从 API 复制到我的数据库表。
我需要每天(在指定时间(使用计划的 cron 作业检查 API 响应,并且应该获取所有可用记录并将其插入数据库。每次响应都可能发生变化,应按照 API 中的规定进行反映。
也没有任何字段可以考虑用于制作唯一 ID。
我无法搜索和排序,因为它不仅仅是更新任务,因此我们应该从 API "复制"数据,而不是"更新"记录。我们需要考虑,
- 从 API 响应中删除已删除的记录,
- 更新修改的记录字段和
- 还插入新记录。
考虑一个例子:
第一天,
让 API 可用的记录为 A1、A2、A3、A4
此记录中可能存在重复的条目。
我们将解析 API 响应并按原样插入可用的任何记录。该脚本将获取记录(A1、A2、A3、A4(并将其插入到我们的表中。
因此,我们的表将包含以下记录:(答1, A2, A3, A4(
第二天考虑,
让 API 可用的记录为 A1、A2、A3、A5、A6 -
可能的情况:
每条记录 A1、A2 和 A3 的字段值可能会更新第一天
A4 现已从 API 响应中删除
现在添加了新记录 A5,A6。
在这种情况下,我们的目标是更新表,使其仅具有记录 A1、A2、A3、A5、A6 及其更新值。
数据应该是结构化的。API 中有特定的字段,需要解析和获取。我们无法估计更改的频率,并且要求每天进行更新。
响应字段值可能会更改,但结构不会更改。应获取值的字段将保持不变,只有更改会影响字段值。
目前大约有2000条记录,很快就会增加到5000条。
不应有任何停机时间,因为此表中的服务由另一个应用程序实时使用。编辑:我正在解析 API 响应并将其插入到一个表中,该表充当另一个应用程序的主表。该应用程序需要在没有任何停机时间的情况下工作,即;即使我们在表上执行一些操作(重新创建表(,也应该有尽可能少的停机时间。
示例 API 响应:
[
{
"company": "XYZ",
"company_id": 123,
"owner": null,
"owner_id": null
},
{
"company": null,
"company_id": null,
"owner": "ABC",
"owner_id": 321
},
{
"company": "XYZ",
"company_id": 123,
"owner": null,
"owner_id": null
},
{
"company": null,
"company_id": null,
"owner": "PQR",
"owner_id": 100
}
]
数据库表应复制给定的 API 响应 - 无论 API 结果中是否有任何可用的错误/重复项。API 响应无法事先预测,也没有任何可以直接字段被视为唯一 ID。
我正在使用PHP-MySQL.API响应是JSON格式。我在SO中看到过类似的问题,但它不能很好地满足我的要求,也没有公认的答案。
定期将数据加载到表中的最佳方法是什么
从上面的问题来看,似乎也需要使用某种临时表。
考虑到安全性,性能和无停机时间,解决此问题的最优雅方法是什么?在这种情况下使用的最佳MySQL存储引擎是什么(InnoDB/MYISAM(?请指教。
我不太确定你的要求是什么,以及为什么理查德伯纳兹的答案不适合你的需求。
您谈论的数组包含少于 10.000 个 json 对象,导致表少于 10.000 行。json 和最后一行之间的差异很容易放入内存中。您可以生成一个长 sql 脚本,其中包含应用更新所需的所有插入、更新和删除,并在一个事务中应用更新。
从要求中不清楚的一件事是提到"实时"并提到这个"每日"更新,这显然是一种批处理类型。您将更新描述为批处理,但提到是否有实时要求?
如果您确实需要连续访问而不是实时数据,则可以使用新值构建一个新表,并按照 https://dba.stackexchange.com/questions/22108/how-do-i-swap-tables-in-mysql 中所述重命名表。假设您有一个名为"CurrentValues"的表,其中包含系统其余部分处理的数据,然后您构建了一个"NewValues"表,该表看起来像您的"当前值"表在瞬间的样子。然后,在一个原子事务中重命名"currentValues"->"oldvalues","newValues->currentValues"。然后执行删除"旧值"。如果你"幸运",来自API的数据是一个完整的列表,可以插入到你的"NewValues"表中。
要实时更新:
您可以在本地副本中添加一个标志(类似于更新的标志 旗(。在更新之前,将所有记录设置为 updated = 0。
期间 API结果解析过程,更新和插入设置更新标志 到 1.解析过程完成后,删除所有记录 仍设置为updated = 0
。
当您以特定顺序接收 id 时,您可以简化此过程(通过首先从数据库中以相同的顺序检索集合,您可以知道缺少哪个集合(。然后,您几乎可以即时删除丢失的。
在您的示例中显示这一点;第二天您收到A1,A2,A3,A5,A6
。您从本地副本加载前 5 条记录(因为只有 4 条,所以最终会得到 A1,A2,A3,A4
条(。
您遍历 API 接收的值,如下所示(伪代码(:
$difference = array_diff($localCopyItems, $apiItems);
// $difference now contains all items present in $localCopyItems which are not present in $apiItems
foreach($difference as $deletionItem) {
// delete $deletionItem from database
}
当然,这是一个过于简化的例子,但这就是它的要点。