2012-01-15 7 views
0

私は、所有権を簡単に判断できるXMLと階層データベースを長い間使用してきました。今、私はランタイムコンテキストを持つリレーショナルデータベースモデルを試しています。ProductIdなどのユニークなIDとリレーショナルプロパティを持つエンティティをロードしています。データベース内の所有関係と参照関係の混在

私の質問は、このモデルの所有権?ターゲットエンティティがエンティティの所有する親である関係を定義したい場合この違いを参照関係に定義する方法と、これを最小限の追加情報でSQLデータベースに保持する方法はありますか?関係のタイプを定義するSQL(MS)のサポートはありますか?

最後に、他のエンティティが削除されたときに削除する他のエンティティ(すべての所有エンティティ)を把握することができます。また、このエンティティをXMLにシリアル化するときに、参照されるエンティティを通常の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> 

ノート・エンティティは、通常NotebookId列と独自SQLテーブル内のノートから分離格納されています。しかし、私はこの列を所有関係としてどのように定義しますか?私はそれをOwnerIdまたはOwningNotebookIdと呼ぶことができ、単に列の名前を分析することができると思います。しかし、私はもっと良い方法を望んでいた。何を指示してるんですか?

答えて

1

主な違いは、1対多リンクの多側で参照が保持されることです。

図書館と著者については、各図書館と著者に多くのノートブックを持たせることができるため、参照はノートブック表に記載されています。

Notesの場合、同じ理由でNoteテーブルに参照があります。

以下のサンプルスキーマはリンクを示しています。

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) 
); 

ノートとノートの間のリンクは、ノートブックが削除された場合、注意がデータベースでも自動的に削除されることを意味し、「削除カスケードの」オプションを、持っています。

デフォルトのオプション "on delete restrict"は、子行が存在する間に親行が削除されないようにします。

NotebookIdをnullにしないとは、対応するノートブックなしでメモを作成できないため、メモのライフサイクルは常に親にリンクされます。