[英]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”匹配的所有學生文檔。 請參閱查詢嵌入式文檔數組。
此外,您可以使用投影從結果中排除和包含字段。
筆記:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.