繁体   English   中英

构建每日销售数据库

[英]Structuring a Daily Sales Database

我想建立一个非常基本的每日销售报告。 我正在尝试决定如何构造数据库以最好地完成此任务。 这是一个用例:

  • 2011年1月5日,提供商A的产品总收入为$ 500
  • 2011年1月5日,提供商A的产品总收入为200美元
  • 2011年1月6日,提供商B的产品总计450美元
  • 提供商B在1月6日从其产品中总共获得$ 75的折扣

我目前的结构是:

PROVIDER table

  • PK
  • 提供商

PRODUCT table

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

start_dateend_date是产品销售可能发生的时间。 它仅用于参考,不会真正影响其他任何内容。

SALES table

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

sales将是该产品销售的每日收益($)。

我不太确定如何存储销售额。 销售额将仅作为每种产品的每日总和来计算。 构造SALES表的最佳方法是什么? 谢谢。

产品表:

  • 该表本质上应该是“临时的”。 这意味着随着时间的变化是灵活的。
  • 在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)unsigned not null auto_increment
  • 名称varchar(255)
  • 价格小数(14.2)
  • 主键(ID)
  • 唯一键(名称)

sales_transaction

  • id int(11)unsigned不为null auto_increment
  • product_id int(11)unsigned not null
  • provider_id int(11)unsigned not null
  • 价格小数(14.2)
  • created_at datetime默认为'0000-00-00 00:00:00'
  • 外键(product_id)引用删除级联上的产品('id')
  • 外键(provider_id)引用删除级联上的提供程序('id')

provider

  • id int(11)unsigned not null
  • name varchar(255)not null
  • 主键(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中。 如果您选择存储在本地时区,那么如果您进行任何需要从本地时区转换的销售,都会遇到很多麻烦。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM