在数据库上存储“用户收到通知的次数”

时间:2018-07-09 11:34:17

标签: java mysql

我正在使用Java Spring和MySQL开发此功能“向所有用户发送通知*次”

这是我想出的数据库结构

表:通知

╔════╦════════════════════╦════════════════════╦══════════════════════╦══╗
║ ID ║       TITLE        ║      CONTENT       ║   RECEIVE_CRITERIA   ║  ║
╠════╬════════════════════╬════════════════════╬══════════════════════╬══╣
║  1 ║ Welcome to our app ║ NULL               ║ Just for demonstrate ║  ║
║  2 ║ Hi                 ║ Welcome to our app ║ Just for demonstrate ║  ║
╚════╩════════════════════╩════════════════════╩══════════════════════╩══╝

表:NOTIFICATION_SETTING

╔═════════╦═══════════════╗
║ NOTI_ID ║ MAX_SEND_TIME ║
╠═════════╬═══════════════╣
║       1 ║             3 ║
║       2 ║             5 ║
╚═════════╩═══════════════╝

表:NOTIFICATION_STATISTIC

╔════╦═════════╦═════════╦════════════════╦══╗
║ ID ║ USER_ID ║ NOTI_ID ║ NUM_OF_RECEIVE ║  ║
╠════╬═════════╬═════════╬════════════════╬══╣
║  1 ║      23 ║       1 ║           2    ║  ║
║  2 ║      32 ║       1 ║           1    ║  ║
║  3 ║      23 ║       2 ║           3    ║  ║
║  4 ║      32 ║       2 ║           5    ║  ║
╚════╩═════════╩═════════╩════════════════╩══╝

我正面临一个问题:

  1. 当创建了新的通知程序(意味着此通知准备首次发送)时,我查询可以接收该通知的合格用户列表,然后循环浏览每个通知并将新记录插入NOTIFICATION_STATISTIC。我收到的列表最多可以包含20,000条记录。

我觉得遍历如此多的记录并执行插入操作可能对我们的服务器来说是个问题,但我不知道如何改善它。所以我想问问是否有更好的解决方案可以解决我的问题?

(请忽略此问题,与1相同的问题)
2.每次我重新发送该通知时,都会查询一个新的用户列表,该列表不存在于NOTIFICATION_STATISTIC中,并执行与步骤1相同的循环。在此接收到的列表最多可以包含1000条记录。

感谢您阅读。

编辑:编辑1)和2)使问题更容易理解

1 个答案:

答案 0 :(得分:0)

问题的第1步说:您将所有用户都排列在“用户”数组中。 步骤2:在此步骤中,您将在NOTIFICATION_STATISTIC表中执行插入操作,并确认是否存在要最大程度减少查询负载的该用户和通知组合的统计信息。

在步骤2之前,请从NOTIFICATION_STATISTIC表中获取所有通知统计信息(例如数组“ statistics”),其中NOTI_ID是您必须插入的当前通知ID(比如说20,000条记录)。

现在,实际步骤2将行插入NOTIFICATION_STATISTIC中,只需从循环中检查当前用户ID的“统计”数组,如果存在,则不插入,如果用户ID不存在于数组中“统计”,然后再插入。

示例代码(只是逻辑,不是为Java编写的):

variable notitfication_id = 3; 
array users; // all list of users
statistics = "SELECT USER_ID FROM NOTIFICATION_STATISTIC WHERE NOTI_ID = notitfication_id"; // SQL query;
foreach (users as user) {
    if (!statistics contain user.id OR user.id IS NOT IN the array statistics) {
        INSERT INTO NOTIFICATION_STATISTIC VALUES ('', user.id, notitfication_id, 0);
    }
}