我有一个PHP脚本,可以从API获取特定项目的价格。该脚本由每5分钟运行一次的cron作业执行。物品的价格在大多数时间保持不变,每天只变化约4或5次。
这就是我现在的表格结构:
CREATE TABLE IF NOT EXISTS `product_details` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`start` datetime NOT NULL,
`end` datetime NOT NULL,
`price` decimal(11,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=38 ;
在前端,我想在不同时期显示价格。因此,如果价格在白天变化3次,则会有3个时间范围和相应的价格。
示例:
2015-05-31 01:55:00 PM to 2015-05-31 04:25:00 PM
Price = $22.33
2015-05-31 04:25:00 PM to 2015-05-31 08:25:00 PM
Price = $33.54
2015-05-31 08:25:00 PM to 2015-05-31 10:25:00 PM
Price = $37.37
如果我每次执行脚本时都要插入新记录,那么一天内就会有200多条记录,而且它会很快变得混乱。因此,只有在获取的价格与前一个不同的情况下才执行INSERT查询。
这就是我现在的脚本:
$last_row = get_last_low();
$current_price = get_current_price();
if ($last_row['price'] == $current_price)
{
UPDATE product_details SET `end`=%s ORDER BY id DESC LIMIT 1;
}
else
{
INSERT INTO product_details (`start`, `end`, `price`)
VALUES (NOW(), NOW(), $current_price)
}
foreach (get_all_records() as $item)
{
display();
}
如果用户指定,我想在每个条目旁边显示价格的增加/减少。我是否应该在表格中添加另一个value_increased
字段?关于如何以最佳方式正确地构建桌子,我完全不知道,所以我不必在以后回顾过去。
你会如何改变它? (我刚刚发布了我的方法来展示我到目前为止所尝试的内容;你的答案并不一定要坚持下去。我只要知道任何想法,我就会这样做。比我的黑客更好。)
答案 0 :(得分:2)
由于您在执行INSERT时已经有了以前的新价格,因此可以轻松计算value_increased并将其存储起来。所以基本上是的,在表格中添加另一个value_increased字段。
而不是更新'结束'每次查询API时,如果你跟踪代码中的最后一次运行时间,你可以在INSERT之前更新它一次(在初始INSERT上为NULL)。
像
这样的东西@Resource Map<String, String> typeCh;
此外,如果您显示所有项目的当前价格,您的查询会变得更加简单 - 类似
$last_row = get_last_low();
$current_price = get_current_price();
if ($last_row['price'] != $current_price)
{
UPDATE product_details SET `end`=%s WHERE 'end' IS NULL;
INSERT INTO product_details (`start`, `end`, `price`)
VALUES (NOW(), null, $current_price)
}
而不是更复杂的东西(有多个产品,你必须得到最新的&#39;结束&#39;然后再次加入以获得相应的价格。当然,如果你是唯一的东西你正在做的是显示所有记录,这不是一个太大的因素。
单个UPDATE意味着您只需更少次点击数据库(即价格变化的次数,而不是您点击API的次数)
<强>缺点强>
缺点是,如果您的应用程序崩溃,您不会知道您上次获得价格的时间(如果跟踪每个价格是强制性的,您基本上必须在API端查询数据库)在最后一次PRICE更改后的所有时间。例如
SELECT * FROM product_details WHERE 'end' IS NULL;
使用您当前的程序,您的数据库将具有
1.00 PM $1.1
1.15 PM $2.0
1.30 PM $2.0
1.45 PM $2.0
--- application crash ----
因此,对于错误恢复,您基本上会在1.45 PM之后查询API以查找所有价格变化。使用修改后的程序,您的数据库将具有
1.00 PM $1.1
1.45 PM $2.0
因此,对于错误恢复,您必须在下午1点之后查询API以查看所有价格变化。请注意,在这两种情况下,API返回的记录数量都是相同的,只是API的重新运行具有较小的数据(取决于上次价格变化的时间)要过滤掉的较大数据集