2010-07-29 2 views
3

이것은 잠시 동안 나를 끌어 당기고있는 것입니다. 데이터 액세스 레이어로 ORM (예 : Nhiberate)이있는 (MVC 유형) ​​웹 애플리케이션을 생각해보십시오. OOP의/리치 도메인 모델 손 - - 한편에Nhibernate (및 일반 ORM) : Objects 또는 ObjectId를 사용합니까?

은 내가 (에 대한 참조) 내가 얘기하고있는 실물 주위에 통과해야한다 생각합니다. 반면

- DB를/웹 응용 프로그램 손 - 나는 그냥 객체가 아닌 객체 자체의 정수 ID를 통과하기 쉽고 더 효율적이라고 생각합니다.

  • 사용자가 로그인하고 상품 페이지로 이동된다

    은 전자 상거래 카탈로그 형 애플리케이션을 고려한다.
  • 댓글을 달았습니다.
  • 이 주석을 지속하는 컨트롤러 작업에는 a) 인증 쿠키의 사용자 ID 또는 b) 제품 ID (아마도 쿼리 문자열의) 및 c) 주석 텍스트의 세 가지 정보가 있습니다.
  • 이제 가장 좋은 방법은 무엇입니까? ORM이 자신의 ID를 읽고 적합한 외국을 설정할 수 있도록 사용되는 모든 것이 사용될 때 사용자와 제품 객체를 부 풀릴 가치가 있습니까 (예 : 저장소에서 가져와 모든 DB 작업이 수반되는 경우) 주석을 저장하는 DB 테이블의 키?

이 항목에 대한 국민의 의견은 무엇입니까? 아마도 웹 응용 프로그램은 무국적 성향으로 인해 다른 앱보다 조금 더 멀리 떨어져야할까요? 나는 그것이 '의존적 인'대답이 될 것이라고 상상하지만, 아마도 어떤 사람들은이 문제에 대해서 순진하다. 예를주는 경우

이것은 내가 할 수 경우 ASP.NET MVC로 그들을 선호 아마도 많은 플랫폼에 적용 할 수있는 일반적인 질문이지만, .

감사합니다.

+0

어떻게 쉽게 "그냥"아이디의이 아니라 참조를 주위에 전달되어 더 많은 정보에 대한

는 Ayende의 블로그 게시물을 체크 아웃? 또한 데이터베이스에서 추가 엔티티를 가져 오는 것 외에 어떤 방식으로도 더 효과적입니까? – apollodude217

+0

@Apollodude : 당연히, 일단 * 당신이 * 더 이상 공연자가 아니라 - 내 포인트가 아니에요. 하지만 두 개의 불필요한 DB 가져 오기 때문에 나를 질겁하게 만듭니다. 모든 사람을 만족시키는 Daniel Auger 솔루션을 확인하십시오. – UpTheCreek

+0

나는 성능 문제가 아주 타당하다는 것에 동의합니다. 나는 다른 혜택에 대해 이해하고 싶었습니다. – apollodude217

답변

3

NHibernate는 이런 이유로 정확하게로드 작업을 수행한다. 나는이 이미 데이터베이스에 존재 알고, 그래서 지금을 선택 귀찮게하지 않습니다 : 위의 예에서

session.Save(
    new Comment 
     { 
     Text = commentTextFromScreen, 
     User = session.Load<User>(userID), 
     Product = session.Load<Product>(productID) 
     } 
}; 

, 당신은 NHibernate에를 말하고있다. Hibernate는 그것들에 대한 프록시 객체를 반환 할 것이고 객체에 대한 어떤 속성에도 접근하지 않는 한 데이터베이스에 대해 select는 일어나지 않을 것이다. The difference between Get, Load, and query by id.

+0

그게 좋습니다! 감사.내가 전에 이것을 알아 차리지 못했던 지 궁금하다. 0 – UpTheCreek

+0

더 일반적으로 (다른 시나리오에서), 게으른 로딩과 캐싱은 데이터베이스에서 초과 데이터를 가져 오는 것을 막을 수있다. id를 app-at-large에 노출시키는 것보다 이러한 기법을 선호하십시오. – apollodude217

관련 문제