簡體   English   中英

在 MongoDB 中設計多對多關系(而不是關系表)

[英]Designing Many-to-Many relationships in MongoDB (instead of relational tables)

使用一個經典的例子——假設我們有一個應用程序,它有一個 Courses 集合和一個 Students 集合,而每個學生可以參加很多課程,每個課程可以有很多參與者。 我們將需要查詢一個學生有效參與的所有課程,但我們還需要查詢正在參加單個課程的學生。

我知道使用關系數據庫來處理這將是最佳解決方案,但現在我只想使用一種類型的數據庫,即 MongoDB,現在我想問一下這種架構設計是否可以有效地工作? 使用它的優缺點是什么? 哪個設計會更好?

User: {
   _id,
   //...properties
}

Course: {
   _id,
   //...properties
}

CourseParticipate: {
   _id,
   userId,
   courseId,
   //...properties
}

CourseAdmin: {
   _id,
   userId,
   courseId,
   //...properties
}

現在我喜歡這個設計,因為將來如果我有能力使用多個數據庫,很容易將這些 collections 轉移到關系數據庫(或不?),我也喜歡它,因為它寫入數據很快並刪除對象之間的關系,但正如我所見,它會使閱讀查詢慢一點(或很多?)。

因為我之前在網上沒見過這個設計,所以我已經知道有更好的解決方案(我希望我沒有聽到發自內心的評論和回答,因為我是新人)。

我也想聽聽你說 Neo4j 能不能解決這個問題? 什么關系數據庫在 MongoDB 旁邊效果最好?

文檔和文章的鏈接將非常有幫助! 謝謝!

這是具有多對多關系的數據的情況。 我認為您的數據庫中有幾千名學生和幾百門課程。

首先,我可以使用以下設計,每個學生都嵌入課程詳細信息,作為稱為courses的子文檔數組。

- students collection
id:
name:
courses: [ { id: 1, name: },  { id: 5, name: }, ... ]

- courses collection
id:
name:
description:

請注意,課程 ID 和名稱都存儲在 collections 中。 這是數據的重復。 這應該沒問題,因為重復的細節不會經常更改(或可能根本不會更改)。

查詢學生注冊的所有課程,例如: db.students.find( { name: "John" } ) 這將返回一個具有匹配名稱的學生文檔和所有課程(數組字段)。 請參閱db.collection.find

查詢所有注冊特定課程的學生: db.students.find( { "courses.name": "Java Programming" } ) 這將返回課程名稱與標准“java Programming”匹配的所有學生文檔。 請參閱查詢嵌入式文檔數組

此外,您可以使用投影從結果中排除和包含字段。

筆記:

  • 您可以將學生信息嵌入課程集合中,而不是將課程嵌入學生中。 查詢將與上述查詢類似,但您將查詢課程集合。 這取決於您的用例。
  • 您可以將課程 ID 字段存儲在學生集合的課程數組中; 這是您經常更改課程名稱字段的情況。 查詢將使用 Aggregation $lookup (“加入”操作)來獲取課程並從課程集合中獲取。
  • 數據信息 Model 基於文檔的 MongoDB 數據的設計

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM