2011-04-05 3 views
0

데이터베이스에는 4,000,000 개의 레코드 (SQL Server)가 포함되어 있으며 실제 크기는 550MB입니다. 데이터베이스의 엔티티는 서로 그래프 스타일로 관련되어 있습니다. 5 레벨 깊이의 데이터베이스에서 엔티티를로드 할 때 문제가 발생합니다 (모든 레코드가로드 됨). Db4O 활성화 깊이, Faq, 웹 응용 프로그램 모범 사례

  • 는 엔티티 프레임 워크와 같은 어떤 메커니즘이 (포함 ("MyProperty.ItsProperty"))

db4o는 데이터베이스와 함께 사용하기위한 최선의 유형 무엇입니까?

  • Guid, Generic Collections에는 어떤 문제가 있습니까?

  • db4o를 사용하는 WebApplication에 대한 모범 사례가 있습니까? 세션 컨테이너 + EmbeddedDb4ODb 또는 클라이언트/ServerDb4O? 도움을

들으 .. 좋은 설명을위한

들으. 하지만 샘플로 내 정확한 문제를주고 싶다 : 나는 3 개 기관이 있습니다 (NN 관계 B 교차로 엔티티 개념이다.. 그래프)


class A 
{ 
public B[] BList; 
public int Number; 
public R R; 
} 
class B 
{ 
public A A; 
public C C; 
public D D; 
public int Number; 
} 
class C 
{ 
    public B[] BList; 
    public E E; 
    public F F; 
    public int Number; 
}

내가 "(dbContext.A.Include를 조회 할 .이 요구 사항이 다른 쿼리에 쿼리를 변경할 수 있습니다

추가 질문 : BList.C.BList.A는 BList.CEG ") (....)

 
I want to get   :A.BList.C.BList.A.R 
But I dont want to get :A.R 
I want to get   :A.BList.C.E.G 
But I dont want to get :A.BList.C.F 
I want to get   :A.BList.C.E.G 
But I dont want get  :A.BList.D 

주".) (포함 " 로드 할 수있는 가능성은 있습니까 A.BList [@Number < 120] .C.BList.A [@ Number> 100] Super syntax :)

+0

과 같은 그래프 데이터베이스를 살펴 봐야합니다. 답변에 대한 업데이트가 추가되었습니다. – Gamlor

답변

4

활성화 : db4o는 어떤 객체가로드되는지를 제어하기 위해 activation-mechanism을 사용한다고 말했듯이 말입니다. 많은 객체가로드되는 것을 막기 위해 다른 전략이 있습니다.

  • 내리고 global default activation-depth : configuration.Common.ActivationDepth = 2 그런 다음 필요에 객체를 활성화하기 위해 아래의 전략을 사용합니다.
  • 를 사용하여 클래스 별 활성 구성 cascading activation, minimummaximun 활성화 깊이 등
  • 활성화 요구에 따라 명시 적으로 객체처럼 :

container.Activate(theObject,5) 그러나이 모든 것들은 복잡한 객체 그래프에 오히려 고통스러운 것입니다. 그 고통에서 벗어나는 유일한 전략은 transparent activation입니다. TransparentlyActivated와 같은 속성을 만듭니다. 이 속성을 사용하여 저장된 클래스를 표시하십시오. 그런 다음 db4otool을 사용하여 수업을 향상 시키십시오. Visual Studio에서 빌드 후 이벤트에 db4otool-명령을 추가처럼 'PathTo\Db4oTool.exe -ta -debug -by-attribute:YourNamespace.TransparentlyActivated $(TargetPath)

GUID를 일반 컬렉션 : 아니오 (버전 7.12 또는 8.0에서). 그러나 자신의 구조체를 저장하는 경우 : db4o가 매우 잘못 처리합니다.

WebApplication : 포함 컨테이너를 권장하고 session-container for each request을 권장합니다.

귀하의 경우로 확장 질문 부분

업데이트. 이러한 복잡한 활성화 스키마의 경우 투명 활성화를 사용합니다. 실제 시나리오에서 공개 필드가 아닌 속성을 사용한다고 가정합니다. 그렇지 않으면 투명한 지속성이 작동하지 않습니다.

투명한 활성화는 기본적으로 메서드/속성이 첫 번째로 호출되는 순간에 개체를로드합니다. 따라서 A.R 속성에 액세스하면 A 자체가로드되지만 참조 된 객체는로드되지 않습니다. 난 그냥 무슨 뜻인지 보여주기 위해 당신이 액세스 패턴의 몇 가지를 통해 이동 :

당신이 A.BList에 액세스 할 때 'A.BList.C.BList.A.R'

  • A를로드 받기. BList 배열은 비활성화 된 개체로 채워집니다.
  • 계속해서 BList.C로 이동합니다. 이 순간에 BList 객체가로드됩니다.
  • 그런 다음 C.BList에 액세스합니다. db4o는 C 객체를로드합니다.
  • 등등.

그래서 당신은 얻을 때 'A.BList.C.BList.AR'다음 'AR'은 모두 가지고있는,

언로드 객체가 'empty' - 쉘 개체로 표시됩니다로드되지 않습니다 값은 null 또는 기본값으로 설정됩니다. 배열은 항상 완전히로드되지만 활성화되지 않은 객체로 채워집니다.

정교한로드 요청을 수행하는 데 필요한 실제 쿼리 구문이 없습니다. 시작 객체를로드 한 다음 필요에 따라 객체를 가져옵니다.

또한 이러한 종류의 액세스가 db4o를 사용하여 네트워크를 통해 끔찍한 성능을 발휘할 것이라고 언급해야합니다.

또 다른 힌트. 그래프 구조에 대한 정교한 작업을 원하면 Neo4J 또는 Sones Graph DB

+0

더 자세한 설명은 무엇입니까? 투명한 활성화? 아니면 다른 것들? – Gamlor

+0

질문이 업데이트되었습니다. –

+0

활성화 문제에 대한 자세한 설명 (샘플 포함)을 추가했습니다. 다른 설명은 좋은 일입니다. 또한 정품 인증에 대한 귀하의 설명이 좋다. 그러나 나는 내 상황이 그보다 더 나쁘다고 생각한다. 고마워 –

관련 문제