객체 데이터베이스에서 다수의 관계를 설계하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1069187

문제

나는 OO 데이터베이스를 살펴볼 때가되었다고 생각하고 다음 작은 프로젝트 인 작은 라이브러리에 DB4O를 사용하기로 결정했습니다.

다음 객체를 고려하십시오 : 책, 카테고리.

책은 0-N 카테고리로 이루어질 수 있으며 카테고리는 0m 책에 적용될 수 있습니다.

나의 첫 번째 생각은 BookCateCory와 같은 결합 된 객체를 갖는 것이지만 약간의 인터넷 검색 후에 나는 이것이 '실제 oo'에 적합하지 않다는 것을 알 수 있습니다.

따라서 또 다른 접근법 (많은 사람들이 권장). Book.categories and Category.books : Book.categories 및 Category.books 모두에 목록을 작성하는 것입니다. 한 쪽은 관계를 처리합니다. Book.addCategory는 Book.categories에 카테고리를 추가하고 Category.books에 책을 추가합니다. 하나의 메소드 호출 내에서 2 개 객체가 변경되면 커밋 및 롤백을 처리하는 방법은 무엇입니까?

당신의 생각은 무엇입니까? 두 번째 접근법은 명백한 장점을 가지고 있지만 적어도 첫 번째 '느낌'이 맞습니다 (더 나은 규범).

도움이 되었습니까?

해결책

객체 데이터베이스를 사용하는 경우 관계가 데이터베이스에 저장되는 방식을 신경 쓰지 않아도됩니다. 당신은 그들 사이의 수업과 관계를 정의합니다. 데이터베이스에 대한 참조 안내를 읽으십시오. 관계의 예 :

n:n attribute, referencing from the parent
------------------------------------------------------------------
class Person{
List addresses;
}

class Address{
}


n:n attribute, referencing from the child
------------------------------------------------------------------
class Person{
}

class Address{
List persons
}

n:n attribute, bidirectional references
------------------------------------------------------------------
class Person{
List addresses;
}

class Address{
List persons
}

다른 팁

이 문제를 해결하기 위해 생각할 수있는 두 가지 방법은 실제로 있습니다. 개인적으로, 나는 첫 번째 접근법 (OO 엔티티로 매핑 객체를 만드는)과 함께 갈 것입니다. 이렇게하면 중복 정보를 유지하고 동기화해야합니다. 또한 협회에 자체 분야 (책이 해당 범주에 할당 된 날짜가 해당 범주에 할당 된 날짜)가있는 경우 쉽게 통합 할 수 있음을 의미합니다. 우리는 시스템의 다양한 연관성 에이 접근법을 사용합니다.

OO 엔티티는 다음과 같습니다.

BookCategory {
 Book book
 Category category
}
Book {
 Collection <BookCategory> categories
}
Category {
 Collection <BookCategory> categories
}

여기서는 관계 객체와 두 컬렉션을 동기화해야합니다. 그러나이 경우 컬렉션은 선택 사항입니다. 일반적으로 ORM 쿼리로 동일한 정보를 얻을 수 있습니다.

대안은 다음과 같은 설정을 갖는 것입니다.

Book {
 Collection<Category> categories
}

Category {
 Collection<Books> books
}

ORM/DB 도구가 자동으로 연결을 유지하는 경우 괜찮습니다. 그렇지 않으면 두 컬렉션을 모두 업데이트하고 있습니다. (최대 절전 모드에서는 한쪽이 속성을 갖습니다. 맵핑시 역 = 참;이면이 업데이트되지 않으므로 엄격하게 말하면 유지 될 필요가 없습니다. 이것은 나쁘게 나에게 나쁜 연습처럼 보입니다.)

일반적으로 관계에 한 가지 방식으로 만 액세스하는 경우 (예 : 모든 책을 카테고리로 가져 오면) 다른 쪽의 컬렉션을 제거 할 수 있습니다. 그런 다음 다른 방향에서 관계에 액세스하기 위해 ORM 도구를 중심으로 작업하고 기본 쿼리를 사용해야한다고 생각합니다.

우리는 프로젝트에서 최대 절전 모드 (Java 기반 객체 관계형 매핑 도구)를 사용합니다. 최대 절전 모드 문서는 OO/Relational Design 문제에 대한 좋은 참조이지만, 유용하게되기 위해 최대 절전 모드를 배우는 데 약간의 시간을 소비해야 할 수도 있습니다.http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#collections-ofvalues

HTH!

나는 당신이 관계형 DB 사고 방식에 약간 매달렸다 고 생각합니다. 각 객체의 목록은 올바른 OO 일입니다. 커밋과 롤백은 문제가되지 않으며, 모든 것을 저지르거나 모든 것을 롤백하는 거래에서 발생합니다.

보석과 같은 순수한 OO 데이터베이스에서 객체 자체는 다른 객체에 대한 참조 모음을 가지고 있습니다. 객체가 응용 프로그램에서 참조되면 OODBMS는 객체를 감싸는 프록시를 생성합니다. 이것에 대한 스키마는 단지 지속 된 객체와 그 객체에 대한 참조의 모음입니다. OODBMS에 반드시 링크 엔티티가 필요하지는 않습니다.

O/R 매핑 레이어 (M : M 관계를 수행하기에 충분히 영리하다고 가정) M : M 관계는 O/R 맵퍼가 뒤의 링크 엔티티로 해결되는 객체 자체에 대한 자회사 참조 모음으로 나타납니다. 장면. 모든 O/R Mappers 가이 작업을 수행하는 것은 아니므로 별도의 링크 개체가있을 수 있습니다.

ODBMS를 사용하고 싶은 특별한 이유가 있습니까? 간단한 데이터 구조 (예 : 책을 분류하는 것)의 경우 일반적으로 RDBMS를 통해 ODBM에서 어떤 이점이 없으며, 실제로 RDBMS의 세계에서 작업하는 데 더 쉽게 작업 할 수 있습니다. ODBMS는 복잡한 데이터 유형이나 동적 객체의 문자 그대로 지속성/저장을 할 때 매우 유형의 이점이 있습니다. ODBMS는 또한 RDBM보다 훨씬 빠르고 확장 가능하다고 인용되지만, 나는 이것에 대한 통찰력을 거의 제공하지 못할 수 있습니다. 그러나 RDBMS 대 ODBMS를 논의하는 몇 페이지는 다음과 같습니다.

객체 지향 데이터베이스에 무슨 일이 있었는지

객체 지향 데이터베이스 대 객체-레클레이션 데이터베이스 (SO)

데이터 복제를 피할 수 있습니다. 그런 다음 차이를 병합하는 데있어 모든 종류의 문제가 발생하기 때문입니다.

이것에 대한 속임수는 참조입니다.

결과적으로 각 객체에 다른 객체 유형에 대한 참조 모음과 다른 객체의 독립적 인 컬렉션이 포함되어 있습니다.

일치하는 테이블은 중개자 연결 클래스에 객체 중 하나에 기인하지 않는 속성이 없다면 관계 적 개념입니다. 쿼리가 2 개에서 많은 관계와의 관계를 줄이고 데이터 복제를 크게 줄이기 때문에 쿼리를 강력한 방식으로 작성할 수 있으므로 있습니다. 일치하는 테이블이없는 관계 데이터베이스 에서이 작업을 수행했다면 상황이 매우 빨리 악하게 될 것입니다. 업데이트는 어떻게 작동할까요? 개인적으로 나는 OO 데이터베이스의 매력이 이것으로부터 멀어지고 있습니다.

모든 객체를 함께 묶는 방식은 코드의 이벤트를 통해 어떤 종류의 트랜잭션 핸들러에 이벤트를 통해 객체 상태를 캐싱 할 수 있습니다. 따라서 서로 속성을 조작하는 객체보다는 핸들러를 통해 변경을 요청하고 결과를 콜백으로 기다립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top