更好的方法来模拟这个简单的模式设计 (MongoDB)?

Better ways to model this simple schema design (MongoDB)?

我有以下情况: 用户可以在网站上添加联系人(其他用户)。可选地,用户还可以将他的联系人分组。 一个用户可以有多个电子邮件、地址和 phone 个号码。

我想到了以下模式设计(文档store/mongodb)。有什么方法可以改善吗? 我主要担心的是个人资料图片嵌入在文档中。我知道这不是一个好的做法,但为了这个特定目的(作业),我也必须在此处嵌入图片 (blob/gridfs)。但我想知道如何改进此架构。

对于用户,我认为您当前的架构很好。在数组中保留多个地址、phone 数字和电子邮件地址是很好的,因为对于特定的人来说不应该有太多地址,并且很容易查询 "who has this email address" 或 "give me all the phone numbers of this person"。不过,您似乎确实有一个多余的 e-mail 字段 - 这是一个特殊的电子邮件地址,如帐户地址,与联系电子邮件区分开来吗?如果是这样,为了其他维护者,我会给它一个描述性的名称,一个像 account_email 这样的名称。我不会将照片保留为斑点,但你说这是其他要求所以我不会批评它。

我喜欢使用单独的联系人集合与群组进行联系的想法。我有一个 contacts 集合,每个文档代表一个联系人

{
    "_id" : ObjectId("..."),
    "owner_id" : ObjectId("..."), // reference to user document of contact owner
    "contact_id" : ObjectId("..."), // reference to user document of contact
    "group" : "Rivals" // group name
}

{ "owner_id" : 1, "contact_id" : 1 }{ "owner_id" : 1, "group" : 1 } 上建立索引,然后像下面这样的查询会很快:

// get all contacts for user x
db.contacts.find({ "owner_id" : x })
// is user y a contact of user x?
db.contacts.count({ "owner_id" : x, "contact_id" : y }) != 0
// get all contacts in group "family" for user x
db.contacts.find({ "owner_id" : x, "group" : "family" })

检索联系人后,为了检索人性化的显示信息,您需要进行第二次查询(应用程序级连接)以检索联系人的实际用户文档。如果你愿意,你可以将一些联系信息反规范化到联系文档中

{
    "_id" : ObjectId("..."),
    "owner_id" : ObjectId("..."), // reference to user document of contact owner
    "contact_id" : ObjectId("..."), // reference to user document of contact
    "group" : "Rivals", // group name
    "contact_name" : "Franke Frankers"
}

如果包含常用信息,则无需进行第二次查询,但如果联系人更新 his/her 信息,您可能需要更新引用它们的每个联系人文档。