0

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

我的问题是如何为这个模型添加某种所有权?如果我想定义一个关系,其中目标实体是实体的拥有父级。如何将这种差异定义为引用关系并将其保存在 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>

Note-entity 通常与 Notebook 分开存储在其自己的带有 NotebookId 列的 SQL 表中。但是如何将此列定义为自有关系?我想我可以称它为 OwnerId 或 OwningNotebookId,然后只分析列的名称。但我希望有更好的方法。你有什么建议?

4

1 回答 1

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

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

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

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

于 2012-01-15T13:38:14.063 回答