我们有一些客户数据,它们开始于一个单独的数据存储。我有一个整合脚本来标准化并将其迁移到我们的核心数据库。大约有6万到7万条记录正在被迁移。
当然,这里有一个小错误,在第9k行左右失败了。
我的下一个技巧是使脚本能够在再次运行时恢复到它停止的位置。
供参考:
来源记录非常讨厌,并且根据他们购买的品牌划分为5个表…即:
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
和$src->tbl
组合
查找
中的匹配项$log[?x?]['row_id']
和$log[?x?]['source_tbl']
组合
为了实现这一点,我必须在 foreach($results AS $row)
循环中执行foreach($log AS $xyz)
循环,并跳过发现已经迁移的任何行(否则,它们将被复制)。这看起来像是一个LOT的循环。
当我们达到4万或5万的时候呢?
这将是50k x 50k的循环!!
问题:
是否有更好的方法让我检查子数组是否有"row_id"one_answers"source_tbl"匹配其他而不是每次循环?
注意:和往常一样,如果有一个完全不同的我应该考虑这个问题,我愿意接受任何和所有的建议:)
我认为你应该在日志上做一个预处理,做row_id and
source_tbl
的哈希(或组合键),并将其存储在一个hashmap中,然后为每一行构建键的哈希,并检查它是否已经在hashmap中定义。
我告诉你使用哈希集,因为你可以用O(k)
时间搜索它,否则它将与你所建议的相同,只是它将是一个更干净的代码。