2012-01-15 4 views
0

나는 소유권을 쉽게 결정할 수있는 XML 및 계층 적 데이터베이스를 오랫동안 사용해 왔습니다. 이제는 런타임 문맥을 갖는 관계형 데이터베이스 모델을 시도하고 있습니다. 고유 한 ID 및 ProductId 등의 관계형 속성을 가진 엔티티를로드하고 있습니다.데이터베이스에서 소유 및 참조 관계 섞기

제 질문은 어떤 종류의 이 모델에 대한 소유권은 무엇입니까? 대상 엔티티가 엔티티의 소유주 인 관계를 정의하고자하는 경우. 이 차이를 참조 관계에 정의하고 최소한의 추가 정보로 SQL 데이터베이스에이를 유지하는 방법은 무엇입니까? SQL (MS)에서 관계 유형을 정의하는 지원이 있습니까?

결국 내가 원하는 것은 다른 엔티티가 삭제 될 때 (다른 소유 엔티티) 삭제 될 다른 엔티티를 알아낼 수 있어야한다는 것입니다. 또한이 엔터티를 XML로 serialize 할 때 참조 된 엔터티를 일반 ID 요소로, 소유 된 엔터티를 전체 XML로 직렬화하려고합니다.

<Notebook Id="1"> 
    <LibraryId>5</LibraryId> <!-- Referenced entity --> 
    <AuthorId>6</AuthorId> <!-- Referenced entity --> 
    <Notes> <!-- Owned entities --> 
    <Note Id="2" /> 
    <Note Id="3" /> 
    <Note Id="4" /> 
    </Notes> 
</Notebook> 

Note-entity는 일반적으로 NotebookId-column이있는 자체 SQL- 테이블에서 Notebook과 분리되어 저장됩니다. 그러나이 칼럼을 소유 관계로 정의하는 방법은 무엇입니까? 나는 그것을 OwnerId 또는 OwningNotebookId라고 부를 수 있고 열의 이름을 분석 할 수 있다고 생각합니다. 그러나 나는 더 나은 방법을 찾고있었습니다. 너는 무엇을 제안 하는가?

답변

1

가장 큰 차이점은 참조가 일대 다 링크의 많은 쪽에서 유지된다는 것입니다.

라이브러리 및 작성자의 경우 각 라이브러리 및 작성자가 많은 노트 책을 가질 수 있으므로 참조는 노트북 테이블에 있습니다.

메모의 경우 동일한 이유로 참조가 메모 테이블에 있습니다.

아래 샘플 스키마는 링크를 보여줍니다.

CREATE TABLE Author 
(
    id int primary key, 
    name varchar(100) 
); 

CREATE TABLE Library 
(
    id int primary key, 
    name varchar(100) 
); 

CREATE TABLE Notebook 
(
    id int primary key, 
    libraryid int not null references Library(id), 
    authorid int not null references Author(id) 
); 

CREATE TABLE Note 
(
    id int primary key, 
    notebookId int not null references Notebook(id) 
           on delete cascade, 
    note varchar(100) 
); 

주와 노트북 사이의 링크

는 노트북이 삭제 된 경우 주 데이터베이스에서 자동으로 삭제되는 것을 의미합니다 "삭제 폭포의"옵션을 가지고있다.

"삭제 제한시"기본 옵션은 자식 행이있는 동안 부모 행이 삭제되지 않도록합니다.

NotebookId를 null로 설정하면 해당 노트가없는 노트를 만들 수 없으므로 메모 수명주기가 항상 부모에 연결됩니다.