更好的方法来模拟这个简单的模式设计 (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 信息,您可能需要更新引用它们的每个联系人文档。
我有以下情况: 用户可以在网站上添加联系人(其他用户)。可选地,用户还可以将他的联系人分组。 一个用户可以有多个电子邮件、地址和 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 信息,您可能需要更新引用它们的每个联系人文档。