我们有一些从单独的数据存储开始的客户数据。我有一个整合脚本来标准化并将其迁移到我们的核心数据库中。大约有 60,000-70,000 条记录正在迁移。
自然地,有一个小错误,它在第 9k 行附近失败了。
我的下一个技巧是让脚本在再次运行时能够从中断的地方继续。
仅供参考:
源记录非常恶心,并按他们购买的品牌分为 5 个表...... IE:
create TABLE `brand1_custs` (`id` int(9), `company_name` varchar(112), etc...)
create TABLE `brand2_custs` (`id` int(9), `company_name` varchar(112), etc...)
当然,给定的公司名称可以(并且确实)存在于多个源表中。
无论如何......我使用 ParseCSV 库进行日志记录,如果成功迁移,每一行都会被记录(如果某些行太丑而无法以编程方式解析,则会被跳过)。使用 ParseCSV 打开日志备份时,它看起来像:
array(
0 => array( 'row_id' => '1',
'company_name' => 'Cust A',
'blah' => 'blah',
'source_tbl' => 'brand1_cust'
),
1 => array( 'row_id' => '2',
'company_name' => 'customer B',
'blah' => 'blah',
'source_tbl' => 'brand1_cust'
),
2 => array( 'row_id' => '1',
'company_name' => 'Cust A',
'blah' => 'blah',
'source_tbl' => 'brand2_cust'
),
etc...
)
我目前的工作流程是这样的:
foreach( $source_table AS $src){
$results = // get all rows from $src
foreach($results AS $row){
// heavy lifting
{
}
我的计划是检查
$row->id
and$src->tbl
组合中的and组合
是否匹配。
$log[?x?]['row_id']
$log[?x?]['source_tbl']
为了实现这一点,我必须在循环内做一个循环foreach($log AS $xyz)
,并foreach($results AS $row)
跳过任何发现已经迁移的行(否则,它们会被重复)。
这对我来说似乎有很多循环。
当我们在创纪录的 #40 或 50000 附近起床时呢?
那将是 50k x 50k 循环!
问题:除了每次循环之外,
我有没有更好的方法来检查子数组是否有“row_id”和“source_tbl”匹配?
注意:与往常一样,如果我应该以完全不同的方式考虑这个问题,我愿意接受任何和所有建议:)