我正在为每日销售报告建立一个数据库。例如:
29/01/2021 ->售出50只苹果30/01/2021 ->售出46只苹果
我有几张桌子:
products
sales
起作用了。但现在我必须记录产品的价格,当它出售时。问题是,产品的价格可以在白天改变,例如:
29/01/2021 -> 43苹果售出(苹果价格:1美元) 29/01/2021 -> 7苹果售出(苹果价格:0.90美元) 30/01/2021 -> 46苹果(苹果价格:1.10美元)
正如你所看到的,在29/01/2021上,we卖了43个苹果给1美元,7个苹果卖到0.90美元,因为苹果的价格发生了变化。我想在sales表中添加一列:price FLOAT NOT NULL,但是如何才能将多个价格与特定的销售相关联呢?
本质上,如何更改sales表以获得输出,如上面的示例所示?我想把price列作为主键:PRIMARY KEY (saledate, product_id, price),但老实说,我不知道它是否是一个干净的解决方案,以及它是否会对性能造成不良影响。目前,插入新销售的查询是:
INSERT INTO sales (saledate, product_id, quantity) VALUES(date_value, product_id_value, quantity_value)
ON DUPLICATE KEY UPDATE quantity = quantity + quantity_value提前谢谢你。
PS:对不起我的英语不好。
发布于 2021-01-30 14:13:47
您真正应该做的(以及许多类似类型的系统架构师的模式)是有两个存储销售信息的规范化表。
一个表是SalesHeader (有时只是称为SalesOrder),另一个表是SalesLine。SalesHeader与SalesLine在OrderId上有一个一对多的外键关系。
SalesHeader存储基本信息,如OrderId (作为primary键)和SaleDate,其中SalesLine表为每个具有Quantity和Price列的ProductId拥有一个新的记录,以及它自己的primary键列,名为LineId。
这允许您灵活地以不同的价格在同一天销售相同的产品,甚至在同一天以不同的价格销售多个产品,甚至批次不同的订单(如果您愿意)。您可以将SalesHeader和SalesLine表调整为与您的用例更相关的表,但这是一般的解决方案。(此外,请不要介意我在命名我的服从命令时使用PascalCasing。:)
发布于 2021-02-01 09:00:05
您的问题是销售表的语义含义。看起来,您希望它包含一个行,该行表示给定产品的某一天的total销售额。
在我看来,一个更好的定义是销售表记录白天的个人销售情况。然后,将其扩展到销售的细节,包括特定销售产品的单价,是有意义的。然后,您还需要扩展SALES表,其中包含对单个订单的某些引用,或者是对客户的引用,或者两者都有。您还可能希望包括确切的销售时间,或者作为一个单独的列,或者(更简单)通过将saledate变成一个完整的时间戳。
https://dba.stackexchange.com/questions/284336
复制相似问题