【问题标题】:Best way to store data like restaurant checkin count?存储餐厅签到次数等数据的最佳方式?
【发布时间】:2016-09-08 21:57:01
【问题描述】:

我有一个显示餐厅资料数据的页面,其中显示的数据之一是该餐厅的用户总签到数

我有一个 mysql 表,如:user_checkins,它将用户签入存储到餐厅,如:

id | user_id | res_id | checkin_date        |
 1 |     102 | 5526   | 2016-04-21 03:20:21 |
 2 |     165 | 5574   | 2016-04-21 06:35:21 |
 3 |     102 | 4565   | 2016-04-24 02:15:30 |

还有一张桌子res_checkin_count

id | res_id | total_checkin_count |
 1 |   5526 | 1055                |

一段时间后,user_checkins 中会创建很多行,因为人们经常签到

问题:我应该删除旧行吗?比如创建一个定时作业,定期(如每天)删除到达餐厅的旧行,并在另一个mysql TABLE 中更新餐厅total_checkin_count 编号,仅存储每家餐厅的total_checkin_count?这会消耗大量内存吗?

我保留行并让它累积并使用SELECT COUNT(*) all 来获取每个餐厅total_checkin_count

编辑:user_checkins 表实际上存储了各种餐馆的所有用户签到,每次有人访问“restaurant_profile”网页时,SELECT COUNT(*) 查询将在user_checkins 表上运行res_id x,以获取total checkin count 那家餐厅,那是多余的吗?

【问题讨论】:

  • 为什么不在单个表中只包含每个位置的运行总数和最后一个签到列?你真的需要知道他们何时登记入住吗?如果可以,可以存档吗?
  • 每当有人访问 restaurant_profile 网页时,我将为 user_checkins 表(存储所有餐厅的签到)运行 SELECT COUNT(),这意味着每次有人访问 restaurant_profile 网页时, SELECT COUNT() 将在该表上运行,这是多余的吗?

标签: php mysql database database-design relational-database


【解决方案1】:

在我看来,这些表在 MySQL 中,但是我将删除 res_checkin_count 是聚合函数的副本,即 COUNT,因此您正在浪费内存,因此只能有两种情况:

1 您的 user_checkins 表没有超过 200 万条记录,并且您为列 res_id 创建了 nuncluster 索引,这样就可以了。

2 您有一个 Monstrous 网站,其中存储了超过 200 万条活动记录,并且您为每个州或每个砖块(3 到 5 个邮政编码)创建表格,这样您将拥有分布式记录,最有可能来自 TX 的人会搜索和查询餐馆来自 TX 等等。

【讨论】:

  • 什么? 200万?如果您的意思是最大 INT 为 20 亿,则使用 unsigned int 可以达到 40 亿以上。
  • 我不是指 Index 可以容纳 INT 的最大数量,我的意思是如果他使用主机提供程序,有时 MySQL 数据库每个表限制为 2 GB。我建议平衡表负载而不是平衡服务器工作负载。
【解决方案2】:

当您说很多行时,您需要评估是否很多行超出了 MySQL 的能力。一般来说,MySQL 应该能够轻松地处理每个表大约 1 亿行。您是否预计很快就会超过 1 亿行?如果没有,请不要理会您的数据,这样可以降低归档系统带来的复杂性。

另一方面,如果您希望表上的行数超过数亿行,那么可以,运行日常作业以删除或归档您的数据有助于保持数据库的良好运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2018-12-01
    • 2013-09-10
    • 2014-07-28
    • 2012-05-10
    相关资源
    最近更新 更多