构建每日销售数据库

时间:2012-01-07 01:25:28

标签: mysql sql database database-design

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

  • 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

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

SALES table

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

sales将是该产品销售的每日进度($)。

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

2 个答案:

答案 0 :(得分:3)

产品表:

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

销售表:

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

通过上述设置,您可以根据product表中的内容更改价格,但不会影响sales_transaction表中记录的已发生的销售额。

伪架构:

product

  • id int(11)unsigned not null auto_increment
  • name varchar(255)
  • 价格小数(14.2)
  • 主键(id)
  • 唯一键(名称)

sales_transaction

  • id int(11)unsigned not null auto_increment
  • product_id int(11)unsigned not null
  • provider_id int(11)unsigned not null
  • 价格小数(14.2)
  • created_at datetime default'00EA 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中。如果您选择以当地时区存储,如果您需要从当地时区进行转换,则会遇到任何令人头疼的问题。

答案 1 :(得分:0)

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