【问题标题】:Better ways to model this simple schema design (MongoDB)?为这种简单的模式设计(MongoDB)建模的更好方法?
【发布时间】:2015-05-21 04:56:36
【问题描述】:

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

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

【问题讨论】:

  • 您打算如何使用该文档?您将运行什么样的查询?什么样的更新?
  • 感谢您的评论!我想查询特定用户的联系人(从用户那里获取所有联系人)并按组显示这些联系人(例如,获取组族中的所有联系人)。用户可以更新自己的信息并创建自己的群组(以便稍后在其中添加联系人)。

标签: mongodb schema schema-design document-store database


【解决方案1】:

对于用户,我认为您当前的架构很好。将多个地址、电话号码和电子邮件地址保存在数组中是很好的,因为对于特定的人来说它们不应该太多,而且很容易查询“谁有这个电子邮件地址”或“给我所有的电话号码这个人”。不过,您似乎确实有一个多余的 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"
}

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

【讨论】:

  • 顺便说一下,我现在正在使用 GridFS 来拍摄照片(没有 blob)。如果您认为它可以做得更好,请告诉我! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2012-10-29
  • 2020-07-20
相关资源
最近更新 更多