2012-01-12 3 views
1

나는 활동을 생성 할 수 있고 사용자는 친구를 가질 수 있으며 각 사용자는 친구들로부터 모든 활동을 가져올 수 있어야합니다. 단일 활동에는 여러 사용자가있을 수 있습니다. Mongodb 데이터베이스 디자인

Users -> _id, name, friendList 
Activity -> _id, description, date, involvedUsers 

그래서 예를 들어 문서는 다음과 같습니다 그래서 지금

"User theo": 1, theo, array(mike, rutger, tijmen) 
"User mike": 2, mike, array(theo, rutger, tijmen) 

Activity x: 1, 'having fun with friends', {{todaydatetime}}, array(1, 2) 
Activity y: 2, 'going out', {{saturdaydatetime}}, array(1, 2) 

경우, 그가 마이크는 마이크가 로그인 할 경우 동일한 "친구들과 재미를해야 할 것"것을 얻을 수 있습니다에서 "테오"로그

그들이 토요일을 날짜로 선택하면 마이크는 테오가 나갈 것이고, 테오는 마이크가 나가는 활동을하게 될 것입니다.

어떻게 할 수 있습니까? MySql에서 조인 등을 사용하면 매우 쉽습니다. 그러나 사용자의 모든 활동을 "친구 목록"으로 가져와 특정 날짜까지 필터링 할 수있는 방법은 무엇입니까? 토요일에 일어나고 있어요.

+0

그래서, 왜 사용할까요 몽고 브? MySQL을 사용하면, 거기에서 어떻게하는지 알 것입니다. –

+1

그건 내 질문이 아니었다. 나는 MongoDb를 사용해야한다. – randomKek

+0

왜 그런지 물어봐도 될까요? –

답변

2

당신은 아마 뭔가를 (이 완전히 안된) 원하고, 당신이 너무 큰 경우 다른 사람이 맞다 친구 목록의 배열 (천)과 관련, 그것은 아마 문제 스케일링가 발생합니다

collection users: 
{ 
    _id: objid, 
    name: "theo", 
    friends: [objid, objid, objid] /* these are user object ids */ 
} 

collection activities: 
{ 
    _id: objid, 
    desc: "having fun with friends", 
    date: new Date(), 
    involved: [objid, objid, objid] /* these are user object ids */ 
} 

나는 날짜와 참여에 ensureIndex 할 것입니다. 인덱싱 배열 값에 대한 자세한 내용은 여기를 참조하십시오 : http://www.mongodb.org/display/DOCS/Multikeys

db.activities.ensureIndex({date:1}); 
db.activities.ensureIndex({involved:1}); 

그래서 (쉘에서) 당신이해야 할 활동에 관련된 사용자를 선택 :

var start_date = new Date(2012, 1, 14); 
var end_date = new Date(2012, 1, 15); 
var friends = db.users.findOne(_id: objid for user).friends; 
var activities = db.activities.find(
    { 
    date: {$gte : start_date}, 
    date: {$lte : end_date}, 
    involved : {$in : friends} 
    }); 
+0

친구 목록에 대해 알고 있지만 mongodb의 지오 코딩 기능과 성능 때문에 MongoDb도 필요합니다. MySQL에 어떤 조언을 해주겠습니까? – randomKek

+0

아마 mongodb를 어느 쪽이든 사용합니다. 더 많은 친구 나 더 많은 사람들을 지원하기 위해 다른 스키마를 사용해야 할 필요가 생기면 다른 컬렉션으로 나눌 수 있습니다. 그러면 답변을 얻기 위해 더 많은 조회가 필요합니다. –

+0

날짜 선택에'$ lt'을 써서는 안됩니다. 단 하루 만 가져 오면 안됩니다 (그렇지 않으면 그 다음 날을 선택한다는 것을 이해해야합니다). –