0

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

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

4

1 回答 1

0

对于用户,我认为您当前的架构很好。将多个地址、电话号码和电子邮件地址保存在数组中是很好的,因为对于特定的人来说它们不应该太多,而且很容易查询“谁有这个电子邮件地址”或“给我所有的电话号码这个人”。不过,您似乎确实有一个多余的e-mail字段-这是一个特殊的电子邮件,例如帐户地址,与联系电子邮件不同吗?如果是这样,为了其他维护者,我会给它一个描述性的名称,比如account_email. 我不会将照片保留为 blob,但你说这是其他要求,所以我不会批评它。

我喜欢使用单独的联系人集合与组进行联系的想法。我会有一个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"
}

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

于 2015-03-19T15:14:30.433 回答