2013-04-08 7 views
0

RavenDb를 사용하여 이벤트 관리자를 개발 중입니다. 기록 된 사용자는 따라 오는 장소에 게시물을 작성한 다음 사용자 벽 (홈 페이지)의 모든 게시물을 볼 수 있습니다. 모든 게시물은 '좋아요'및 '즐겨 찾기'로 표시 될 수 있습니다. 트위터 또는 페이스 북과 같은 작은 구조.RavenDb -id 목록에서 목록 가져 오기

내가 팔로우하는 장소에서 게시물을 가져 오는 가장 좋은 방법은 무엇입니까? 좋아요 및 즐겨 찾기 수를 가져와야하며 이미 뷰를 표시하고 목록을 표시하려면 뷰 모델에 해당 게시물을 표시해야합니다. 나는 이런 식으로 노력하고있어하지만 최대 요청 예외 던져.

  var myPlaces = this.SessionDb.Query<EventFollow>() 
       .Where(ls => ls.UserId == User.Identity.Name) 
       .Select(l => l.PlaceId); 

      var listPosts = this.SessionDb 
       .Advanced.LuceneQuery<Post>().WhereIn("PlaceId", myPlaces) 
       .Skip(skip) 
       .Take(20) 
       .ToList(); 


      List<PostViewModel> posts = new List<SpottedViewModel>(); 

      foreach (var p in listPosts) 

      { 
       PostViewModel vm = new PostViewModel(); 

       vm.Creator = p.UserCreatorId == User.Identity.Name; 

       vm.Like = this.SessionDb.Query<Lol>().Where(lol => lol.SpottedId == p.Id).Count(); 

       vm.Favourites = this.SessionDb.Query<Favourite>().Where(fa => fa.SpottedId == p.Id).Count(); 

       vm.Post= s; 

       vm.IsLike = this.SessionDb.Query<Like>().FirstOrDefault(l => l.PostId == p.Id) != null; 

       vm.IsFavourite = this.SessionDb.Query<Favourite>().FirstOrDefault(f => f.SpottedId == s.Id) != null; 


       posts.Add(vm); 
      } 

나는이 모델이 있습니다

public class Post 
{ 
    public string Id { get; set; } 
    public string UtenteCreatorId { get; set; } 
    public string PlaceId { get; set; } 
    public string Body{ get; set; } 
} 

public class Lol 
{ 
    public string Id { get; set; } 

    public string PostId { get; set; } 

    public string UserId { get; set; } 
} 

public class Place 
{ 
    public string Id { get; set; } 

    public string UserCreatorId { get; set; } 

    public string Name{ get; set; } 
} 

public class Favourite 
{ 
    public string Id { get; set; } 

    public string PostId { get; set; } 

    public string UserId { get; set; } 
} 

public class EventFollow 
{ 
    public string Id { get; set; } 

    public string PlaceId { get; set; } 

    public string UserId { get; set; } 
} 

내 영어 주셔서 감사하고 죄송합니다! ; D

답변

0

여기서 문제는 ID 목록에서 실제로 문서 목록을 가져 오지 못한다는 것입니다. IDocumentSession.Load 메서드를 사용하고 문서 ID 목록을 보내거나 WhereIn을 사용하여 문제를 해결할 수 있습니다. 너는 그래. 문제는 모델 디자인입니다.

데이터 모델을 심각하게 다시 디자인 한 것 같습니다. 그것은 지금과 같이 강하게 관계형이며, RavenDB는 관계형이 아닙니다 (또는 어쨌든 관계형 모델로 최적화되었습니다). 유스 케이스가 무엇인지 정확히 알기는 어렵지만 '포스트'모델에는 '즐겨 찾기'와 '좋아요'를 저장하고 '사용자'모델에는 'EventFollow'를 넣을 수 있습니다.

또한 RavenDB의 "safe by default" 원칙에 따라 세션 당 30 개의 요청으로 제한됩니다 (기본값 당 설정 가능). select N+1이 여기에 있습니다. 따라서 30 가지 요청을 훨씬 능가 할 것입니다. 그래서 예외가 생깁니다.

+0

네, 그러나 RavenDb Group (Google)에서 한 전문가는이 데이터 모델이 결국 좋아하는 것 또는 좋아하는 것에 대한 선례보다 더 우수하다고 말했습니다. – Stefano

+0

그건 나에게 놀라운 일입니다. 토론에 대한 링크가 있습니까? –

+0

https://groups.google.com/forum/#!topic/ravendb/vclQkOKBjJU – Stefano

관련 문제