首页 > 解决方案 > Mysql 数据库设计销售报告

问题描述

因此,我决定如何为这个销售报告设计我的数据库。

这是场景。我有 10 万多个用户,每个用户每天进行 0 次或更多次销售。如果她/他的销售额为 0,那么当天不会为该用户存储任何内容,否则如果她/他的销售额超过一次,那么当天的销售额只会增加 1。

现在的问题是关于数据库设计(关注最终性能)。一种简单的方法是只创建一个带有日期和 user_id 的表,并使用 WHERE 子句获取给定用户的每周、每月和每年的销售业绩。

Table: user_sales_counter
--------------------
user_id, sales, date

但是,我在这里看到的问题是,如果在六个月后,我想查看某个用户特定一周的报告,那么在最坏的情况下,我将不得不遍历 1800 万条记录。

所以我想问的确切问题是,我是否可以为每周、每月和每年的记录保存另外三个表,这将允许我做两件事,我可以删除每日销售数据,比如超过 2 个月,但我仍然'd 可以访问用户的每周、每月等销售记录,因为这些表的清除可以设置为例如 1 年或更长时间。

Table: weekly_sales_counter
---------------------------
week_no, month_no_year, user_id, sales

Table: monthly_sales_counter
----------------------------
month_no_year, user_id, sales

Table: yearly_sales_counter
---------------------------
year, user_id, sales 

我正在使用 Redis 进一步减少对这些表的读取。

我看到这种方法的缺点是,我必须运行 4 个查询来记录单个销售计数器,而不是一个,因为每个表的计数器必须单独递增。

最好的方案是什么?单桌还是第二桌?或者你有其他我可以采取的方法吗?

谢谢

标签: database-design

解决方案


根据我的经验,从百万交易数据中查询将需要越来越长的时间。我的建议是:

  1. 创建一个表以保留您将来要使用的最小周期单位。
  2. 创建 crontab 或触发器或任何东西以在该表上按用户 ID 计算销售额和分组,您可以在一天结束或一周结束时计算它,尝试找到最佳方法。
  3. 每当您想显示该计数器时,您只需从该表中选择,再次按用户 ID 分组,它将比事务表上的计数更轻。

推荐阅读