我正在使用JavaSpring和mysql开发这个函数“发送通知给所有用户*次”
这是我提出的数据库结构
表:通知
╔════╦════════════════════╦════════════════════╦══════════════════════╦══╗
║ ID ║ TITLE ║ CONTENT ║ RECEIVE_CRITERIA ║ ║
╠════╬════════════════════╬════════════════════╬══════════════════════╬══╣
║ 1 ║ Welcome to our app ║ NULL ║ Just for demonstrate ║ ║
║ 2 ║ Hi ║ Welcome to our app ║ Just for demonstrate ║ ║
╚════╩════════════════════╩════════════════════╩══════════════════════╩══╝
表:通知设置
╔═════════╦═══════════════╗
║ NOTI_ID ║ MAX_SEND_TIME ║
╠═════════╬═══════════════╣
║ 1 ║ 3 ║
║ 2 ║ 5 ║
╚═════════╩═══════════════╝
表:通知统计
╔════╦═════════╦═════════╦════════════════╦══╗
║ ID ║ USER_ID ║ NOTI_ID ║ NUM_OF_RECEIVE ║ ║
╠════╬═════════╬═════════╬════════════════╬══╣
║ 1 ║ 23 ║ 1 ║ 2 ║ ║
║ 2 ║ 32 ║ 1 ║ 1 ║ ║
║ 3 ║ 23 ║ 2 ║ 3 ║ ║
║ 4 ║ 32 ║ 2 ║ 5 ║ ║
╚════╩═════════╩═════════╩════════════════╩══╝
我面临一个问题:
当创建了新的通知程序(表示此通知准备第一次发送)时,我查询可以接收该通知的用户的合格列表,然后循环遍历每个通知程序,并将新记录插入到通知统计中。我收到的列表最多可以是20000条记录。
我觉得遍历这么多记录并执行插入对我们的服务器来说可能是个问题,但我不知道如何改进它。所以我想问,是否有更好的解决办法,可以解决我的问题?
(请忽略此项,与1的问题相同)
2每次重新发送通知时,我都会查询通知统计中不存在的新用户列表,并执行与步骤1相同的循环。我在这里收到的列表最多可以是1000条记录。
谢谢你的阅读。
编辑:编辑1)和2)使问题更容易理解
1条答案
按热度按时间5f0d552i1#
问题的第一步是:数组中的所有用户都是“users”。步骤2:在这一步中,您在notification\统计表中执行插入操作,并确认是否存在要最小化查询负载的该用户和通知组合的统计信息。
在步骤2之前,从notification\u statistic表中获取所有通知统计信息(如数组,例如“statistics”),其中noti\u id是必须插入20000条记录的当前通知id。
现在,实际的步骤2在notification\u statistic中插入行,只需检查循环中当前用户id的“statistics”数组,如果它在那里,则不插入,如果用户id不在数组“statistics”中,则只插入。
示例代码(只是逻辑,不是为java编写的):