构建每日销售数据库

问题描述 投票:0回答:2

我想建立一个非常基本的每日销售报告。我正在尝试决定如何构建数据库以最好地实现这一目标。这是它的一个用例:

  • 2011 年 1 月 5 日,提供商 A 从其产品中总共获利 500 美元
  • 2011 年 1 月 5 日,提供商 A 从其产品中总共赚取了 200 美元
  • 2011 年 1 月 6 日,提供商 B 从其产品中总共赚取了 450 美元
  • 1 月 6 日,提供商 B 从其产品中总共获利 75 美元

我当前的结构是:

PROVIDER table

  • PK
  • 提供商

PRODUCT table

  • 提供商(FK)
  • 产品
  • 开始日期(销售)
  • 结束日期

start_date
end_date
是产品可能发生销售的时间。仅供参考,不影响其他。

SALES table

  • 产品(FK)
  • 销售
  • 如何存储日期

sales
是该产品销售的每日收益(美元)。

我不太确定如何存储销售额。销售额仅按每种产品的每日总和计算。构建

SALES
表的最佳方式是什么?

mysql sql database database-design
2个回答
4
投票

产品表:

  • 该表本质上应该是“暂时的”。这意味着它可以随着时间的推移而灵活地改变。
  • 2011 年,您可能以 15.99 美元的价格出售产品 A,但在 2012 年,您希望以 16.99 美元的价格出售相同的产品,因此您希望您的表格足够灵活,能够应对此类更改。
  • 尽管此表中存储的数据具有灵活性,但如果您删除产品,则必须小心。如果您删除产品,它将孤立销售表中任何匹配的销售交易,或者删除它们(取决于 FK 行为)。

销售表:

  • 该表本质上应该是“事务性”的。这意味着一行代表与销售相关的产品,并及时冻结。
  • 如果买家 A 在 2011 年以 15.99 美元购买了产品 A,您希望按原样记录这笔交易,任何时间点的数据都没有变化,它反映了一笔交易。
  • 如果买家 B 在 2012 年以 19.99 美元的价格购买了相同的产品 A,则您希望将其记录为单独的交易。当然是同一个产品,但是这一行代表一个新交易。

通过上述设置,您可以根据需要在

product
表中更改价格,但这不会影响
sales_transaction
表中记录的已发生销售。

伪模式:

product

  • id int(11) 无符号非空自动增量
  • 名称 varchar(255)
  • 价格小数(14.2)
  • 主键(id)
  • 唯一密钥(名称)

sales_transaction

  • id int(11) 无符号非空自动增量
  • product_id int(11) 无符号非空
  • provider_id int(11) 无符号非空
  • 价格小数(14.2)
  • created_at 日期时间默认 '0000-00-00 00:00:00'
  • 外键(product_id)在删除级联时引用product('id')
  • 删除级联时外键(provider_id)引用provider('id')

provider

  • id int(11) 无符号非空
  • 名称 varchar(255) 不为空
  • 主键(id)
  • 唯一密钥(名称)

现在,您可以按照您在问题中的要求运行查询来获取任何提供商在任何日期的任何产品的总和。

示例查询:

# On Jan 5, 2011, Provider A makes $500 total off of its products
SELECT prov.*, SUM(sales.price)
FROM
    provider AS prov
INNER JOIN
    sales_transaction AS sales on sales.provider_id = prov.id
WHERE
    provider.name = 'Provider A'
AND
    sales.created_at BETWEEN '2012-01-05 00:00:00' AND '2012-01-05 23:59:59'
GROUP BY
    prov.id

提供的架构本质上是骨架,因此可以根据您的业务需求随意添加列,但它应该让您朝着正确的方向前进。

另外,最后一条建议是,我建议将日期时间存储为 UTC。如果您选择在本地时区存储,并且进行任何需要从本地时区进行转换的销售,您将会遇到很多麻烦。


0
投票

为什么销售表中没有日期字段?这将使每条记录都记录特定产品在特定日期的销售总额。

© www.soinside.com 2019 - 2024. All rights reserved.