问题分为两个部分,这里主要讨论两个Collections。
users
集合和messages
集合。
目标
第1部分:
两个集合都具有many-to-many
关系。可以向一个用户发送多个消息,并且可以将一条消息发送给多个用户。我知道这是SQL DB的理想情况,但就目前而言,我只需要使用NoSQL(MongoDB)。
我研究了here,here和here给出的各种建议,它们主要是建议在每个具有集合ID的集合中嵌入一个数组
用户集合
{
_id : user_id_1,
................
messages : [msg_id_1, msg_id_2]
}
邮件收集
{
_id : msg_id_1,
filtering_criteria : {
age : 50,
sex : 'M'
.........
}
...............
users: [user_id_1, user_id_2]
}
这种方法的问题在于,随着时间的推移,阵列将变得太大,从而导致明显的性能问题。
避免此问题的建议是创建一个单独的集合,并将每个发送的邮件作为一个新的单独文档插入。
邮件发送集合
{
_id : msg_id_1,
sent_to: user_id_1,
sent_at : "some_iso_timestamp"
},
{
_id : msg_id_1,
sent_to: user_id_2,
sent_at : "some_iso_timestamp"
},
...................
...................
第2部分
这是我必须确保客户不会收到重复消息的部分。
我有一项服务,每隔4个小时就会读取一条消息及其条件,然后根据条件选择用户,然后将消息发送给这些用户。
我应该如何实现这一部分?如果我查询users
集合而没有查看message_sendouts
集合,则查询将一次又一次返回相同的客户。
我可以在users
集合中为每个用户设置一个标志,该标志将告诉我msg_1
是否已发送给该用户,但这不是正确的解决方案,因为消息数量可以是任何东西,我将再次遇到文档增长问题。
什么是解决此问题的最佳方法?
预先感谢