混合数据库中的拥有和引用关系

时间:2012-01-15 10:50:29

标签: .net sql entity entity-relationship ownership

我长期使用XML和分层数据库,很容易确定所有权。现在我正在尝试一个关系数据库模型,其中我有一个运行时上下文,我正在使用唯一的ID和关系属性(如ProductId等)加载实体。

我的问题是我如何为此模型添加某种所有权?如果我想定义一个关系,其中target-entity是实体的拥有父代。如何将这种差异定义为引用关系并将其保留在SQL数据库中,并且只需要最少的额外信息? SQL(MS)中是否有任何支持来定义关系类型?

最后,我想要的是能够找出在删除某个其他实体(所有拥有的实体)时要删除的其他实体。此外,在将此实体序列化为XML时,我希望将引用的实体序列化为普通的id-elements和拥有完整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通常与Notebook一起存储在自己的SQL表中,并带有NotebookId列。但是,如何将此列定义为拥有的关系?我想我可以称之为OwnerId或OwningNotebookId,只是分析列的名称。但我希望有一个更好的方法。你有什么建议?

1 个答案:

答案 0 :(得分:1)

主要区别在于引用位于“一对多”链接的多面。

对于图书馆和作者,参考文献在Notebook表格上,因为每个图书馆和作者都可以有许多笔记本。

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

Note和Notebook之间的链接有一个“on delete cascade”选项,这意味着如果删除了Notebook,数据库也会自动删除Note。

默认选项“on delete restrict”将阻止在子行存在时删除父行。

使NotebookId不为空意味着没有相应的笔记本就无法创建注释,因此注释生命周期始终链接到父级。