到目前为止,我一直在使用关系数据库,而且我现在很难调整我对数据库设计的思考方式,因为我已经切换到MongoDB(使用Mongoose with Express)。
我经常发现自己要去“那么为什么我不能只在那里引用一个id来引用?...等等”并且只是默认回到关系数据库的思考。 / p>
我理解MongoDB的意思是嵌套JSON结构。但我发现,如果我使用这种方法,我可以在技术上将我的整个应用程序嵌套在一个集合中。但不知怎的,我觉得这不是正确的方法......这是我的应用程序的简单示例布局:
{
company: {
collections: [{
createdBy,
documents: [{
text,
createdBy
}],
title
}],
templates: [{
text,
createdBy,
placeholders
}],
users: [{
email,
firstName,
lastName,
password
}]
}
}
公司将拥有许多用户,每个用户都可以创建模板,用户还可以创建集合(如包含文档的文件夹),这些集合将包含许多文档,但文档不必属于集合。文档是从现有模板创建的(但它们不需要在数据库中有任何关系)。
我觉得我可以在技术上制作一个名为company
的集合,并将其他所有内容作为子文档嵌套在其下。或者我习惯的方式就是将id引用添加到所有内容中,并将所有内容都设置为单独的集合。
这两种方式似乎都不会有点不确定......有人可以使用我的示例并告诉我他们如何在MongoDB中正确设计数据库,并解释他们为什么选择以他们的方式做到这一点?
这将极大地帮助我更好地理解如何在Mongo中设计数据库模式。
非常感谢!
答案 0 :(得分:2)
举个例子,让我们看一下users
的{{1}}。
有多种方法可以设置它。
company
文档中的字段(与您一样); 如果您选择第二个选项,则需要将用户链接到公司。您可以通过外键以多种方式执行此操作:
company
文档中添加user
个ID数组; company
文档中添加company
个ID数组; 或者,您可以复制user
集合的users
字段中的部分或全部用户数据。在您的定义中,company
集合中每个用户有4个字段; company
集合可以包含有关每个用户的其他信息,例如帐号或家庭住址。
现在,最大的问题是:您应该选择哪个选项?
这主要取决于您期望运行的查询/搜索。一些例子:
如果您想显示公司的页面,其中包含该公司所有用户的列表,则在公司集合中包含相关的用户信息意味着您只需要1个查询即可查找显示此页面的所有信息。
如果您希望用户以某种方式登录,则有一个单独的users
集合是有意义的。
如果用户可以在多家公司中,并且您希望能够在用户页面上显示用户所属的公司列表,则可以使用users
中的companies
数组集合。
遵循这些指南可能会对您有所帮助:
您可以找到更多指导on the mongodb blog。