2014-09-13 5 views
0

처음으로 MongoDB 데이터베이스를 구축하는 동안 몇 가지 DB 디자인 문제가 발생합니다.MongoDB 모델링 임베디드 임베디드 올바른 방법

이 주제에 대해 읽은 모든 항목에서 데이터가 인 경우이이 문서에 포함될 때 포함 된 문서를 추가하는 것이 좋습니다. 그래서 여기에 내 현재 문제 :

나는 사용자가 있습니다. 모든 사용자는 주소을 가질 수 있습니다. 주소는 사용자에게 고유 한 것이므로 사용자 수집가에게 삽입 된 문서 여야한다고 말하고 싶습니다.

나는 또한역할을 저장할 (예 : "사용자", "모드"는 "관리자")는이 - 나는 내 프로젝트에서 여러 가지 역할이 있기 때문에 그리고 역할도 roleType에 (예 : "사용자 유형이있다 ")

나뿐만 아니라 그것으로 이어질 것이 내 사용자 컬렉션에 데이터의 이러한 종류를 저장하려는 경우 :

  • 정말 사용자 수집을 폭파 (그러나, 나는 거의 항상 READ 할 수 있기 때문에 쓰기 작업을하지 이 문제가 그리 큰 문제는 아닐 수도 있습니다.)
  • 데이터 구조를 깨끗하게 유지하는 좋은 방법이 없습니다 (예 : 모든 역할 == 관리자는 동일한 객체 ID를 가질 수 없습니다.)

(SQL에서) 저는 ROLE_TYPE 테이블과 ROLE_TYPE 테이블에 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}, 
}) 

여기서 주소 필드를 중첩 된 문서로 포함 시켰습니다. 또한 ROLES 배열의 역할 만 허용된다는 Mongoose의 enum 특성을 활용했습니다. 목록에없는 역할을 저장하려고하면 오류가 반환됩니다.

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'}, 
}) 

각 역할도 확실히 같은 별도의 스키마에이 이동 할 유형을 가져야한다는 의미 경우

하지만, 이제 새 사용자를 저장하면 해당 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

관련 문제