2012-06-19 59 views
21

我要建造我的node.js /快遞/ 貓鼬/護照應用,我想正確的架構設計爲用戶和帳戶。MongoDB的架構設計多個auth用戶帳戶

將有用戶從twitter和facebook以及本地帳戶登錄。在稍後階段,我希望用戶能夠將twitter和facebook與我的應用程序(甚至更多的外部帳戶)連接起來。

我想不出一個好的解決方案。以下是我正在考慮的選項:

1.擁有配置文件模型和帳戶模型。個人資料文檔代表唯一用戶,而帳戶提供用戶名和密碼(內部帳戶)或來自auth-provider(外部帳戶)的認證數據。一個配置文件必須至少有一個嵌套帳戶文檔。

var ExtAccountSchema = new Schema({ 
    type: String, // eg. twitter, facebook, native 
    uid: String 
}); 

var IntAccountSchema = new Schema({ 
    username: String, 
    password: String 
}); 

var ProfileSchema = new Schema({ 
    firstname: String, 
    lastname: String, 
    email: String, 
    accounts: [Account] // Pushing all the accounts in there 
}); 

我不喜歡它什麼都從不同的帳戶數據產生的不太一致帳戶文件和事實,我也很難找到合適的帳戶時,在我的用戶日誌(搜索UID和帳戶類型嵌套-.-文件)

2.Having所有數據單一模式

var ProfileSchema = new Schema({ 
    firstname: String, 
    lastname: String, 
    email: String,   
    twitter-uid: String, 
    facebook-uid: String 
    password: String 
}); 

嗯,這只是醜陋-.-可能更容易/更快地找到正確的帳戶數據,但它不是對媽媽很好intain。

有沒有更好的解決方案? 是否有最佳做法?

+0

與關係數據庫不同,使用MongoDB最好的模式設計很大程度上取決於您如何訪問數據。您將如何使用帳戶數據,以及您將如何訪問它? –

+0

我將使用帳戶數據與護照進行身份驗證。配置文件數據幾乎可以在每個頁面上以多用途的方式訪問。我將通過貓鼬ODM – Sven

+0

訪問它。因此,只有在用戶登錄後才能訪問帳戶數據,並且一旦發生登錄,您將使用會話機制來跟蹤登錄。 (而不是每個頁面訪問需要帳戶數據。) –

回答

39

1)還有,你可能採取的結構,MongoDB的數據三大戰略:

  • 一)擴展到嵌入式文件
  • B)嵌入引用數組
  • C)的陣列母公司文件

策略(a)是您描述的第一個,其中配置文件文件包含帳戶子文件數組。 (b)與策略(a)類似,但是您可以使用對其他文檔(通常在Account集合中)的引用數組,而不是嵌入實際文檔。

策略(c)是您所描述的「在單一模型中擁有所有數據」的策略。

2)它通常被認爲是使用嵌入式文檔數組的最佳實踐,特別是如果它們中的信息可能有所不同。如果它會讓你的生活更輕鬆,你可以使用一鍵區分帳戶類型,像這樣:

{ 
    firstname: 'Fred', 
    lastname: 'Rogers', 
    email: '[email protected]', 

    accounts: [ 
      { kind: 'facebook', 
       uid: 'fred.rogers' 
      }, 
      { kind: 'internal', 
       username: 'frogers', 
       password: '5d41402abc4b2a76b9719d911017c592' 
      }, 
      { kind: 'twitter', 
       uid: 'fredr' 
      } 
      ] 
    } 

3)的MongoDB,您可以在嵌入文檔搜索。所以你會寫下面的查詢語句(JavaScript語法):

db.profile.find( 
     { email: '[email protected]', 'accounts.kind': 'facebook' } 
     ); 

有了合適的索引,這個查詢就會很快。

+0

寫得很好的答案:-)謝謝。我在想那個,但不知道該怎麼做。如果可以的話,我會給出更多的觀點。再次感謝。 – Sven

+0

我是否應該使用複合稀疏索引? 'ProfileSchema.index({accounts.kind,accounts.uid},{unique:true,sparse:true});'? – CheapSteaks

+0

你應該**不要**使用複合稀疏索引。複合稀疏索引幾乎總是不會做你想要的。請爲此打開一個新線程。 –