데이터베이스에 MongoDB를 사용하고 있습니다. 현재 작업중인 쿼리에서 내 스키마의 결함이 있음을 알 수 있습니다. 아래는 내 컬렉션의 관련 레이아웃입니다. 게임은 체스이기 때문에 games.players는 2 명의 플레이어로 구성됩니다. SQL 데이터베이스에서 Mongo 다중 쿼리 또는 데이터베이스 정규화
All msgs for games which a user is in which is newer than a given timestamp.
, 내 쿼리가 유사 것이다 :
users {_id, username, ...}
games {_id, players[], ...}
msgs {_id, username, gameid, time, msg}
내가 필요로하는 데이터는
SELECT * FROM msgs WHERE time>=$time AND gameid IN
(SELECT _id FROM games WHERE players=$username);
그러나, 몽고는 관계형 데이터베이스 아니다 따라서 하위 쿼리 나 조인을 지원하지 않습니다. 가능한 해결책은 두 가지입니다. 성능면에서 효율적이고 효율성면에서 무엇이 좋을까요? 사용자가에서, 다음에 $를 사용한다
- 여러 쿼리
- 선택 게임은에 의해 msgs.gameid와 일치합니다.
- 기타?
- 정상화
- 확인 users.games는 사용자의 모든 게임이 포함되어 있습니다. msgs.players에
- 복사 games.players을 msgs.gameid
- 등으로,
그럴 수는 있지만 users.games가 선형 적으로 커짐을 의미합니다. 당신은 나를 반대로 생각하게 만들었고 games.players를 msgs에 복사했습니다. 그런 다음 시간과 사용자가 일치합니다. – Justin
을 제외하고는 사용자 당 사용자 당 하나의 레코드 만 있습니다. Msgs는 msg마다 문서를 가지고 있으므로 대처 game.player는 각 msg에 많은 하위 객체를 배치합니다 (많은 데이터가 추가됨). 메시지가 전송 된 후 게임 회원이 변경 될 수 있습니다. "사용자"안에 "게임"을 저장하는 것은 게임 내에서 플레이어를 저장하지 않아도된다는 것을 의미합니다. 사용자 내부의 "게임"필드를 인덱싱 할 수 있습니다. –
좋아, 내가 분명히 했어야, games.player는 체스 게임을위한 것이기 때문에 크기 2의 상수이다. 이것이 당신의 추천을 바꿀까요? 귀하의 방법은 조인이 없기 때문에 2 개의 쿼리가 필요하다고 생각하지만, 제 1 번만 필요합니다. – Justin