2014-09-13 61 views
0

第一次構建MongoDB數據庫時,我遇到了一些數據庫設計問題。MongoDB建模嵌入式文檔正確的方式

從我在這個主題上閱讀的所有內容來看,當數據爲特定時,添加嵌入式文檔是一個很好的習慣。所以這裏是我目前的問題:

我有一個用戶收集。每個用戶可能有一個地址。由於地址是特定於用戶的,因此我認爲這應該是我的用戶收集器的嵌入式文檔,對吧?

我也想存儲角色(例如,「用戶」,「國防部」,「管理員」) - 因爲我有我的項目很多不同的角色,一個角色也有角色類型(如「USERTYPE 「)

如果我想這些類型的數據保存到我的用戶採集以及它會導致成:

  • 真的炸掉用戶採集(但是,因爲我幾乎總是這樣讀,而不是寫操作這可能不是太大的問題)
  • 沒有好的方法來保持數據結構的清潔(例如,所有角色==管理員不能有相同的對象ID)

在SQL我只是繼續前進並創建一個表ROLE_TYPE和表ROLE與FK ROLE_TYPE。在這種情況下,對於mongoDB來說,這可能還是應該如此,否則我是否應該將所有內容都放入用戶集合中?

回答

1

你有正確的想法,即使它看起來像你腹脹您的用戶架構它是不是具有一對多的關係表從長遠來看,更容易維護,這裏有一個例子您的用戶架構可能的樣子:

var ROLES = ['user', 'mod', 'admin']; 
var UserSchema = new Schema({ 
    email: {type: String}, 
    address: { 
     address: {type: String}, 
     city: {type: String}, 
     zipCode: {type: Number}, 
     country: {type: String}, 
    }, 
    role: {type: String, enum: ROLES}, 
}) 

在這裏你可以看到我嵌入地址字段作爲嵌套文檔。我也使用了Mongoose的枚舉屬性,它說只有ROLES數組中的角色是允許的。如果您嘗試保存不在列表中的角色,它將返回一個錯誤。

但是,如果你的意思是,每個角色也應該有一個類型的我肯定會提出這個到一個單獨的模式是這樣的:

var ROLES = ['user', 'mod', 'admin']; 
var RoleSchema = new Schema({ 
    name: {type: String, enum: ROLES}, 
    type: {type: String}, 
}); 

並將其鏈接到您的UserSchema:

var UserSchema = new Schema({ 
    ... 
    role: {type: Schema.Types.ObjectId, ref: 'Role'}, 
}) 

現在,當您保存新用戶時,您需要找到相應的角色對象並將該對象的ID保存到用戶,這裏是一個示例:

Role.findOne({name: 'user', type: 'userType'}, function(err, role) { 
    var user = new User({ 
     email: '[email protected]', 
     address: { 
      address: '500 Wall St', 
      city: 'Seattle', 
      zipCode: 98121, 
      country: 'USA', 
     }, 
     role: role._id, 
    }) 
}) 

希望幫助,讓我知道如果你有任何其他問題。

+0

非常感謝您的解釋。我想我會像在你的例子中那樣創建RoleSchema。 – Markus 2014-09-13 18:00:36