在MongoDB中难以建立多对多关系

时间:2019-05-02 12:48:11

标签: javascript mongodb database-design nosql database-schema

问题分为两个部分,这里主要讨论两个Collections。 users集合和messages集合。

目标

  1. 根据某些条件选择用户并向他们发送消息。
  2. 客户不应收到重复的消息

第1部分:

两个集合都具有many-to-many关系。可以向一个用户发送多个消息,并且可以将一条消息发送给多个用户。我知道这是SQL DB的理想情况,但就目前而言,我只需要使用NoSQL(MongoDB)。

我研究了hereherehere给出的各种建议,它们主要是建议在每个具有集合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是否已发送给该用户,但这不是正确的解决方案,因为消息数量可以是任何东西,我将再次遇到文档增长问题。

什么是解决此问题的最佳方法?

预先感谢

0 个答案:

没有答案