2014-08-29 39 views
6

据我所知,连接在文档数据库中不可能或不可靠。我来自关系数据库背景,并试图了解如何处理这种情况。如果没有JOIN,在文档数据库中处理数据的正确方法是什么?

比方说,我有一个Employees集合,用于存储所有员工相关信息。下面是一个典型的员工文件:

{ 
    "id": 1234, 
    "firstName": "John", 
    "lastName": "Smith", 
    "gender": "Male", 
    "dateOfBirth": "3/21/1967", 
    "emailAddresses":[ 
     { "email": "[email protected]", "isPrimary": "true" }, 
     { "email": "[email protected]", "isPrimary": "false" } 
    ] 
} 

我们也可以说,我有一个单独的项目集合,其中我将项目数据存储,看起来就像是:如果我想返回一个列表

{ 
    "id": 444, 
    "projectName": "My Construction Project", 
    "projectType": "Construction", 
    "projectTeam":[ 
     { "_id": 2345, "position": "Engineer" }, 
     { "_id": 1234, "position": "Project Manager" } 
    ] 
} 

在我的所有项目和项目团队中,我如何处理确保我返回团队中个人的所有相关信息,例如全名,电子邮件地址等?

这是两个单独的查询吗?一个用于项目,另一个用于ID出现在项目集合中的人员?

如果是这样,我该如何插入关于人们的数据,例如全名,电子邮件地址?然后在我的应用程序中做一个foreach循环来更新数据吗?

如果我依靠我的应用程序来处理所有相关数据的填充,这是不是会影响文档数据库(如MongoDB)的性能优势?

感谢您的帮助。

回答

7

“......我该如何处理,确保我返回了团队中个人的所有相关信息,例如全名,电子邮件地址等?是两个单独的查询吗?”

它可以是2个独立的查询,或者你非规范化到项目文档。在我们的应用程序中,我们执行第二个查询并尽可能在文档中将数据标准化。

实际上,在顶层文档中的任何地方都看不到“_id”键。此外,对于您将拥有数百万个文档的集合,您可以通过保留键“简洁”来节省存储空间。考虑“name”而不是“projectName”,“type”而不是“projectType”,“pos”而不是“position”。它似乎微不足道,但它加起来。您还需要在“team.empId”上放置索引,以便查询“Joe平均工作的项目数量”运行良好。

{ 
    "_id": 444, 
    "name": "My Construction Project", 
    "type": "Construction", 
    "team":[ 
    { "empId": 2345, "pos": "Engineer" }, 
    { "empId": 1234, "pos": "Project Manager" } 
    ] 
} 

另一件事习惯是,你不必要更新单个字段,或者说,一个新的成员加入到球队每次写整个文件。您可以执行唯一标识文档的目标更新,但只更新单个字段或数组元素。

db.projects.update(
    { _id : 444 }, 
    { $addToSet : "team" : { "empId": 666, "position": "Minion" } } 
); 

这两个查询一开始就让一件事情感到痛苦,但你会过去它。

+0

非常感谢你们! – Sam 2014-08-29 18:25:18

0

Mongo DB是一个文档存储数据库。 它支持高可用性和可伸缩性。

根据我的理解,为了返回所有项目和项目团队(详细信息), 的列表,您将不得不运行2个查询。 由于mongoDb没有FK限制,我们需要在程序级别进行维护。 而不是FK约束, 1)如果数据较少,那么我们可以将数据作为子文档嵌入。 2)而不是规范化的数据库设计方式,在MongoDb中我们需要根据访问模式进行设计。即我们需要更可能查询数据的方式。 (然而,更新的时间更多(较慢),但在用户端,性能主要取决于读取活动,这会比RDBMS更好)

以下链接提供了免费的mongo Db证书课程。 Mongo DB University 他们也有一个论坛,这是非常好的。

相关问题