请看下面的表格:
每天从前一天的销售记录中进行批量下载,以填充表格。
每天下载的数据不仅包含前一天的销售数据,还包括过去90天内的所有数据(可能超过50,000条记录)。
然而,由于某些事情的影响,例如:
第1天的数据可能会因为原始插入之后的变化而发生改变。
+-------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| date | date | NO | | NULL | |
| sku | varchar(10) | | | NULL |
| impressions | int(11) | NO | | NULL | |
| sales | int(11) | NO | | NULL | |
+-------------+---------+------+-----+---------+----------------+
每天从前一天的销售记录中进行批量下载,以填充表格。
每天下载的数据不仅包含前一天的销售数据,还包括过去90天内的所有数据(可能超过50,000条记录)。
然而,由于某些事情的影响,例如:
第1天的数据可能会因为原始插入之后的变化而发生改变。
Date: 2015-01-01
SKU: ABCD
Impressions: 100
Sales: 0
第二天。
Date: 2015-01-01
SKU: ABCD
Impressions: 100
Sales: 3
Date: 2015-01-02
SKU: ABCD
Impressions: 105
Sales: 0
对于从数据下载中得到的任何记录,可能会出现以下情况:
a) 已经被看到并且与以前相同 - 忽略 b) 新的 - 添加到数据库 c) 已经被看到但是有新数据 - 更新
可以通过检查每一行来解决这个问题。
while (!$file->eof()) {
$row = $file->fgets();
$data = explode("\t", $row);
$sku = $data[0];
$date = $data[1];
$impressions = $data[2];
$sales = $data[3];
$order = $em->getRepository('Orders')->findOneBy(['sku' => $sku, 'date' => $date]);
if($order && $order->getImpressions() != $impressions && $order->getSales() != $sales) {
$order->setImpressions($impressions);
$order->setSales($sales);
} else {
... create new model
}
$em->persist($order);
}
然而,将要更新数据的行很少,为每一行做一次选择意味着由于行数庞大,这个工作会非常慢。
所以我的问题是,有哪些模式可以尽可能地有效地解决这个问题?
欢迎任何想法。