我有以下情况:
我使用网站上的REST API获取用户最近50次销售的列表。对于每次销售,它返回产品名称和销售的时间戳(以及其他一些东西,如金额等)。
我想逐步向我的数据库添加新的销售额,但我不知道如何避免重复的条目,因为我没有获得任何销售ID或类似的东西。我猜测我必须将时间戳和产品名称组合起来为每次销售生成一个唯一的哈希值,并将其用作我表中的主键。
这是正确的方法,我将如何在代码中实现它?我使用的是PHP。
干杯
答案 0 :(得分:0)
你没有很多选择。您可以使用两个字段在表上创建UNIQUE INDEX,以避免重复,或生成哈希以识别它们(例如,sha1($name.$timestamp)
)。
答案 1 :(得分:0)
修改强>
您的问题是,您需要对您无法控制的服务发送的冗余数据进行重复数据删除。 (我在之前的回答中误解了这一点。)
您似乎每次销售都有产品和时间戳。您是否还有其他识别信息,例如商店或注册号码?
这五十件物品总是最近五十件吗?它们是否以REST请求中的任何有用顺序呈现 - 例如最早的?
如果您获得三个新行和47个重复项,那么副本是否与之前收到的项目相同 - 同一时间,产品,金额,其他内容?
如果是这样,我会做以下事情。
使用这些列和索引创建表。
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
inserttime DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
repeats INT NOT NULL DEFAULT 0
saletime DATETIME
item VARCHAR(nn)
amount int
description (etc)
PRIMARY KEY (id)
UNIQUE INDEX (saletime,item, amount, description)
然后,当您从REST界面接收记录时,请按如下方式插入它们。
INSERT INTO table (saletime, item, amount, description)
VALUES (?,?,?,?)
ON DUPLICATE KEY UPDATE repeats=repeats+1
这将使用MySQL独特的密钥设置来删除重复项。同时,它会告诉您获取重复数据的频率,以及您最近获得的数据。
您可以随时了解最近的促销活动
SELECT MAX(saletime) FROM table
并且您的复合索引将有助于满足该查询。
为此目的,不要使用多列的SHA样式哈希。这是一个臭名昭着的MySQL反模式。这是因为MySQL的索引在他们的组织中是BTREE(有序),而散列是无序的。