database-design - 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 个查询来记录单个销售计数器,而不是一个,因为每个表的计数器必须单独递增。
最好的方案是什么?单桌还是第二桌?或者你有其他我可以采取的方法吗?
谢谢
解决方案
根据我的经验,从百万交易数据中查询将需要越来越长的时间。我的建议是:
- 创建一个表以保留您将来要使用的最小周期单位。
- 创建 crontab 或触发器或任何东西以在该表上按用户 ID 计算销售额和分组,您可以在一天结束或一周结束时计算它,尝试找到最佳方法。
- 每当您想显示该计数器时,您只需从该表中选择,再次按用户 ID 分组,它将比事务表上的计数更轻。
推荐阅读
- android - 忽略 popBackStack() 调用:FragmentManager 已经保存了它的状态
- python - Scikit-learn 中 OneHotEncoder 和 KNNImpute 之间的循环循环
- css - 在 Bootstrap 4 标注中添加一个很棒的字体图标
- r - R 函数 bquote() 的元素数量与 expression() 不同
- python-siphon - 850hPa 温度平流示例不工作
- python - 从 base.html 模板向 views.py 发送 POST 请求
- css - React Native - 相对垂直堆叠元素?
- unix - 在 Centos OS 中格式化 Web Ontology RDF 文件
- javascript - 如何在 Google Chrome 扩展程序的背景页面上收集信息,并在弹出窗口中显示该信息?
- python - 无法在 Airflow 中导入自定义 python 模块