2010-05-19 13 views
3

데이터 관리를 위해 Hibernate/Spring 및 MySQL 데이터베이스를 사용합니다.데이터베이스에 트리 구조 저장

현재 트리 구조가 JTable에 표시됩니다. 트리는 여러 개의 분기를 가질 수 있으며 다시 분기는 여러 개의 분기 (최대 9 개 레벨)를 가질 수 있습니다. 최근에는 더 깊은 레벨에서 새 지점을 만들고 싶을 때 성능 문제가 있습니다.

현재 분기에는 상위에 대한 외래 키가 있습니다. domain 객체는 parent-branch를 반환하는 getParent()를 호출하여 부모 객체에 액세스 할 수 있습니다. 레벨이 깊을수록 새로운 지사를 만드는 데 더 오래 걸립니다. 새로운 지점을 만드는

마이크로 벤치 마크 결과 등이있다 :

레벨 1 : 32 MS. 수준 3 : 80ms. 수준 9 : 232 MS.

분명히 수준 (부모의 수를 의미)이 이에 대한 책임이 있습니다. 그래서 이런 종류의 문제를 해결할 부속 장치가 있는지 묻고 싶습니다. Hibernate가 새로운 브랜치를 생성하는 동안 전체 객체 트리 (루트까지 모든 부모)에 대해 알아야하는 이유를 이해하지 못한다. 그러나 브랜치가 다른 어떤 객체와도 관계가 없기 때문에 이것이 새로운 브랜치를 생성하는 동안 지연의 유일한 이유가 될 수 있습니다.

나는 모든 대안이나 제안에 대해 매우 감사 할 것입니다.

접견, ymene

+0

마침내 openId 등록이 완료되었습니다. 나에게 가장 잘 맞는 해결책이 무엇인지 알리고, 도움을 청했습니다. 모두에게 고마워. – crusam

답변

2

기본적으로 일대일 관계 구조가 있습니다. 최대 절전 모드에서는 모두 매핑에 의존합니다. 매핑 조정, java.util.Set을 사용하여 부모에서 자식까지 일대 다 관계를 사용합니다.

List가 순서대로 나열되므로 ArrayList를 사용하지 마십시오. 따라서 최대 절전 모드는 해당 순서에 대해서만 추가 열을 추가합니다.

또한 게으른 속성을 확인하십시오. 부모를로드하고 자식 세트 속성에서 lazy = "false"로 설정하면 성능에 영향을 줄 수있는 모든 자식이 DB에서로드됩니다.

어린이의 'inverse'속성도 확인하십시오. 자식 테이블에서 inverse가 true이면 하위 엔터티를 별도로 관리 할 수 ​​있음을 의미합니다. 그렇지 않으면 부모만을 사용하여 작업을 수행해야합니다.

역으로 google을 사용하면 도움이 될 것입니다.

감사합니다.

+0

자세한 답변을 보내 주셔서 감사합니다. U는 맞습니다. 관계는 일대 다로 선언되며 집합을 사용하여 그런 식으로 선언됩니다. 우선 맵핑에 집중하십시오. 힌트를 주셔서 감사합니다. 모든 재산에 대해 아픈 곳에서 얘기하고있는 곳을 확인하십시오. – crusam

+0

감사합니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 최대 절전 모드는 항상 까다 롭고 우리를 혼란스럽게합니다. :) – Parth

1

Hibernate는 내부적으로이 문제를 처리하는 방법을 모르겠어요. 그러나 데이터베이스에 트리 구조를 저장하는 여러 가지 방법이 있습니다. 트리에서 수행 된 많은 쿼리에 대해 매우 효율적인 방법은 "nested set"접근 방식을 사용하는 것입니다.하지만 이는 기본적으로보고있는 성능 문제 (예 : 값 비싼 삽입)가 발생합니다. 빠른 삽입 또는 삭제가 필요한 경우 보유하고있는 것과 같이 갈 것입니다. 간단한 parent-ID를 사용하고, Hibernate가 지금까지 무엇을하고 있는지 보려고한다.

+0

중첩 된 세트에 대해서도 읽었습니다. 불행히도 구조를 빠르게 변경할 수있는 기능이 필요하므로 u와 같은 중첩 된 세트가 구조 변경을 비용 부담으로 말했지만 명령을 읽는 것이 매우 좋습니다. 개체 대신 ID 만 사용하는 것에 대한 아이디어는 흥미 롭습니다. 나에게는 틀린 느낌이 들지만 최대 절전 모드로 전체 계층 구조를 해결할 수 없기 때문에 시도해 볼만한 가치가있을 수 있습니다. 그 배후에 대해 감사드립니다! – crusam

1

SQL에서 데이터를보고 할 필요가 없다면, 대신 XStream과 같은 것을 사용하여 JTable을 데이터베이스로 직렬화하면됩니다. 그렇게하면 나무를 다루는 비싼 데이터베이스 쿼리에 대해 걱정할 필요가 없습니다.

+0

큰 나무의 경우 비용이 많이 들지만 모든 업데이트마다 전체 내용을 직렬화해야하고 첫 번째 수준 노드 만 원한다고해도 전체 내용을 가져와야합니다. – tster

+0

불행히도 많은 것을보고해야하므로 사용할 수 없습니다. – crusam

1

MySQL에서 XML 지원을 사용할 수 있습니다.이렇게하면 계층 구조를 지원할 수 있습니다. 필자는 MySQL에서 XML 지원을 한 번도 사용하지 않았기 때문에 다른 DBMS와 마찬가지로 완전한 기능을 갖추고 있는지 알지 못합니다. (SQL Server와 DB2는 제가 알고있는 훌륭한 지원을 가지고 있습니다.
절대로 절전 모드를 사용하지 않았으므로 인터페이스를 사용할 수 있는지 또는이 경우 자신의 DB 코드를 작성해야하는지는 모르겠다. (내 추측은 쓰고있을 것입니다. 자신의 쿼리).

+0

데이터베이스 관리 시스템에 독립성을 유지하는 것을 선호하지만 다른 어떤 기회도 발견하지 못하면이 점에 대해서도 연구 할 것입니다. 그것에 대해 아직 들어 본 적이 없지만 매우 흥미로운 힌트입니다. 그 점에 대해서도 연구하고 있습니다! 고맙습니다! – crusam