我有以下情况:用户可以在网站上添加联系人(其他用户)。可选地,用户还可以将他的联系人组织成组。一个用户可以有许多电子邮件、地址和电话号码。
我想到了以下架构设计(文档存储/mongodb)。有什么方法可以改善这一点吗?我主要担心的是个人资料图片嵌入在文档中。我知道这不是一个好习惯,但为了这个特定目的(作业),我也必须在此处嵌入图片(blob/gridfs)。但我想知道如何改进这个模式。
我有以下情况:用户可以在网站上添加联系人(其他用户)。可选地,用户还可以将他的联系人组织成组。一个用户可以有许多电子邮件、地址和电话号码。
我想到了以下架构设计(文档存储/mongodb)。有什么方法可以改善这一点吗?我主要担心的是个人资料图片嵌入在文档中。我知道这不是一个好习惯,但为了这个特定目的(作业),我也必须在此处嵌入图片(blob/gridfs)。但我想知道如何改进这个模式。
对于用户,我认为您当前的架构很好。将多个地址、电话号码和电子邮件地址保存在数组中是很好的,因为对于特定的人来说它们不应该太多,而且很容易查询“谁有这个电子邮件地址”或“给我所有的电话号码这个人”。不过,您似乎确实有一个多余的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"
}
如果您包含常用信息,则无需进行第二次查询,但如果联系人更新了他/她的信息,您可能需要更新引用他们的每个联系人文档。