首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何记录产品销售的价格?

如何记录产品销售的价格?
EN

Database Administration用户
提问于 2021-01-30 14:02:17
回答 2查看 783关注 0票数 1

我正在为每日销售报告建立一个数据库。例如:

29/01/2021 ->售出50只苹果30/01/2021 ->售出46只苹果

我有几张桌子:

products

  • id INT AUTO_INCREMENT主键
  • 名称VARCHAR(100) NULL
  • 价格浮动不为空
  • deleted_at日期时间为空,
  • 其他东西

sales

  • 销售日期,
  • product_id INT,
  • 数量整数,
  • 主密钥(saledate,product_id),
  • 外键(product_id)引用产品(Id),

起作用了。但现在我必须记录产品的价格,当它出售时。问题是,产品的价格可以在白天改变,例如:

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),但老实说,我不知道它是否是一个干净的解决方案,以及它是否会对性能造成不良影响。目前,插入新销售的查询是:

代码语言:javascript
复制
INSERT INTO sales (saledate, product_id, quantity) VALUES(date_value, product_id_value, quantity_value)
ON DUPLICATE KEY UPDATE quantity = quantity + quantity_value

提前谢谢你。

PS:对不起我的英语不好。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2021-01-30 14:13:47

您真正应该做的(以及许多类似类型的系统架构师的模式)是有两个存储销售信息的规范化表。

一个表是SalesHeader (有时只是称为SalesOrder),另一个表是SalesLineSalesHeaderSalesLineOrderId上有一个一对多的外键关系

SalesHeader存储基本信息,如OrderId (作为primary键)和SaleDate,其中SalesLine表为每个具有QuantityPrice列的ProductId拥有一个新的记录,以及它自己的primary键列,名为LineId

这允许您灵活地以不同的价格在同一天销售相同的产品,甚至在同一天以不同的价格销售多个产品,甚至批次不同的订单(如果您愿意)。您可以将SalesHeaderSalesLine表调整为与您的用例更相关的表,但这是一般的解决方案。(此外,请不要介意我在命名我的服从命令时使用PascalCasing。:)

票数 2
EN

Database Administration用户

发布于 2021-02-01 09:00:05

您的问题是销售表的语义含义。看起来,您希望它包含一个行,该行表示给定产品的某一天的total销售额

在我看来,一个更好的定义是销售表记录白天的个人销售情况。然后,将其扩展到销售的细节,包括特定销售产品的单价,是有意义的。然后,您还需要扩展SALES表,其中包含对单个订单的某些引用,或者是对客户的引用,或者两者都有。您还可能希望包括确切的销售时间,或者作为一个单独的列,或者(更简单)通过将saledate变成一个完整的时间戳。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/284336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档