情况如下:
我们有产品'A123',我们必须记住它的最低价格。 一个产品的价格来自随机数量的商店,并且无法判断商店x何时会向我们发送'A123'的价格。
所以我有一个带有列的SQL表:
product_number
price
shop (from which shop this price comes)
用于更新产品价格的SQL函数如下所示(这是SQL伪代码,语法无关紧要):
function update_product(in_shop, in_product_number, in_price)
select price, shop into productRow from products where product_number = in_product_number;
if found then
if (productRow.price > in_price) or (productRow.price < in_price and productRow.shop = in_shop) then
update row with new price and new shop
end if;
else
insert new product that we didn't have before
end if;
(productRow.price&lt; in_price和productRow.shop = in_shop)条件是为了防止这样的情况:
在产品表中我们有
A123 22.5 amazon
然后再来自亚马逊的信息:
A123 25 amazon
由于上述条件,我们将价格更新为更高,这是正确的行为。
但算法在这种情况下失败:我们再次在products表中有一行:
A123 22.5 amazon
然后来自梅林的信息
A123 23 merlin (we don't update because price is higher)
然后来自亚马逊的信息
A123 35 amazon
我们更新表格,现在我们有:
A123 35 amazon
但这是错误的,因为此前Merlin的产品价格较低。
知道如何避免这种情况吗?
答案 0 :(得分:3)
您要解决问题的唯一方法是跟踪每个商店的价格,然后只返回当前最低价格。因此,例如,您需要一个类似于您已有的表格,但当您从表格中选择以下内容时:
select min(price)
from products
where product_number = :my_product
就个人而言,如果是我,我会在收到产品价格更新时保留时间戳,以便您能够确定何时获得更新。
答案 1 :(得分:2)
要完成这项工作,您应该维护一个包含以下内容的表:
然后通过查询该表来识别当前最佳供应商 - 您可以在请求时执行此操作,也可以在更新表时以任何方式更新表格,并以稍微复杂的架构和查询为代价来简化问题
补充(以下评论):
好的,这意味着您需要存储更多数据 - 但您没有大量选择 - 需要数据来解决问题,因此您要么:a)必须更新所有价格供应商同时然后从该快照中选择最优价格或b)在您获得价格时存储价格并从您获得的数据中选择最优价格。前者意味着在获取和处理数据方面需要相当大的开销,而后者基本上是一个相当适度的存储问题,而且任何体面的数据库都可以轻松应对。
答案 2 :(得分:1)
基本上,问题是您只存储来自1个供应商的最低价格。您必须保留所有供应商的价格记录,并使用选择查询来选择最小值。
例如,如果您有:
A123 22.5 Amazon
你得到了:
A123 23 Merlin
你必须插入它,即使价格较高,因为它是一个不同的供应商。所以你会:
A123 22.5 Amazon
A123 23 Merlin
当您从亚马逊获得新价格时,例如:25,您只需更新它。所以你会得到:
A123 25 Amazon
A123 23 Merlin
然后在这种情况下选择最低价格,Merlin。