2013-07-13 48 views
2
之間的多重關係

比方說,我建立一個社區博客引擎:貓鼬 - 對象

  • 我們有幾類Category
  • 我們有許多博客Blog
  • 我們有很多帖子Post
  • 我們可能有作者Account
  • 每個Category可能包含幾個Blog
  • Blog可以包含在幾個Category
  • Blog可能包含幾個Post
  • Post可以包含在幾個Blog
  • Account可以既是ownereditor的幾個Blog的。這就是爲什麼它可能在ownereditor字段中包含幾個Blog的ObjectID的數組。
  • 每個Blog可能由幾個Account的擁有和編輯。這就是爲什麼它可能包含ownereditor字段中幾個Account的ObjectID的數組。

這裏有一個模式:

categorySchema = mongoose.Schema(
    title: String 
    blogs: [ 
    type: ObjectId 
    ref: "Blog" 
    ] 
) 

blogSchema = mongoose.Schema(
    title: String 
    description: String 
    owner: 
    type: ObjectId 
    ref: "Account" 

    editor: [ 
    type: ObjectId 
    ref: "Account" 
    ] 
    category: [ 
    type: ObjectId 
    ref: "Category" 
    ] 
    posts: [ 
    type: ObjectId 
    ref: "Post" 
    ] 
) 
postSchema = mongoose.Schema(
    blogs: [ 
    type: ObjectId 
    ref: "Blog" 
    ] 
    author: 
    type: ObjectId 
    ref: "Account" 
) 

accountSchema = mongoose.Schema(
    name: String 
    owner: [ 
    type: ObjectId 
    ref: "Blog" 
    ] 
    editor: [ 
    type: ObjectId 
    ref: "Blog" 
    ] 
) 

每一個崗位也可能包含喜歡,評論和其他對象,可能只涉及該對象。

問題是當我嘗試添加新的Blog時,我將不得不在許多集合中管理很多字段。同樣的事情是當我編輯Blog或刪除 - 我必須找到,檢查,修改/刪除很多對象中的各種數組字段中的很多記錄。

suggested,我不應該存儲直接關係(分類 - >博客,博客 - >主題),只有反向關係(博客 - > Categores,帖子 - >博客),當我需要獲得某些類別的所有博客,執行一個簡單的Blogs.find({category: cat_id}),但想一下如果我需要一些深的請求,如Get all Blogs where account_ID both owner and editor。假設事實上可能有很多博客,並且每個博客可能包含很多歌曲和edtiors,直接Blog.find {owner:acc_id, editor:acc_id}將會更快。那爲什麼我認爲我需要雙向鏈接。

所以,我的問題是:

  • 我真的需要對象之間的2-定向鏈接?
  • 如果是,是否有任何工具可以優化使用它?

也許我應該在Mongoose中使用某種多對多的關係?

謝謝!

+0

在我看來,你想建立對象之間的關係。請問爲什麼選擇mongoDB?它的重點在於它是一個noSQL db。這意味着當你開始開發一個mongoDB應用程序時,你應該改變你的思維方式。你需要思考的不是關係,而是關於文章。每篇文章都應該完整。一旦你開始設計關係,你打破了NoSQL模型,你會討厭mongoDB。你會認爲這是最糟糕的,而事實並非如此。所以我會說找出你的設計,然後決定一個數據庫。 – Zee

回答

0

不,你不需要雙向鏈接。

所有你需要的是

Blog->Category 
Blog->Editors 
Blog->Owners 
Post->Blog 

因爲你的類別和用戶永遠不會改變對象ID,那麼你不必擔心博客裏更新引用。另外,當您想刪除博客時,請勿刪除記錄。相反,請添加標記爲已刪除博客的標誌。當您顯示內容時,只需檢查相應博客的刪除標誌,或者甚至爲查詢添加條件以完全避免這些結果。 (這也有保留歷史的好處)

總而言之,不是創建雙向鏈接,而是從更具體和可更改的內容鏈接到更多靜態內容。要刪除記錄,您可以添加刪除標記,不必擔心追蹤記錄,或者您可以選擇所有具有相關blog_id的帖子,並先刪除它們。