別のデータストアで開始されたいくつかの顧客データがあります。標準化してコア DB に移行するための統合スクリプトがあります。約 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
{
}
私の計画は、 andの組み合わせ
に一致するものがあるかどうか、
$row->id
andの$src->tbl
組み合わせをチェックすることです。
$log[?x?]['row_id']
$log[?x?]['source_tbl']
これを実現するには、foreach($log AS $xyz)
ループ内でforeach($results AS $row)
ループを実行し、既に移行されていることがわかっている行をスキップする必要があります (そうしないと、重複してしまいます)。
それは私にはたくさんのループのようです。
記録が 4 万または 5 万位になったときはどうでしょうか。
それは 50k x 50k ループになります!!
質問:毎回ループする以外に
、サブ配列に "row_id" と "source_tbl" の一致があるかどうかを確認するより良い方法はありますか?
注:いつものように、これについてまったく別の方法で考える必要がある場合は、あらゆる提案を受け入れます :)