3

我们有一些从单独的数据存储开始的客户数据。我有一个整合脚本来标准化并将其迁移到我们的核心数据库中。大约有 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->idand$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”匹配?


注意:与往常一样,如果我应该以完全不同的方式考虑这个问题,我愿意接受任何和所有建议:)

4

1 回答 1

0

我认为您应该对日志进行预处理,对其进行散列(或组合键)row_id and source_tbl并将其存储在散列图中,然后为每一行构造键的散列并检查它是否已在散列图中定义。

我告诉你使用散列集,因为你可以随着O(k)时间的推移在其中搜索,否则它与你提出的只是一个更干净的代码相同。

于 2013-03-27T16:30:33.230 回答