【问题标题】:Mixing owning and referencing relationships in databases在数据库中混合拥有和引用关系
【发布时间】:2012-01-15 10:50:29
【问题描述】:

我长期使用 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,然后只分析列的名称。但我希望有更好的方法。你有什么建议?

【问题讨论】:

    标签: .net sql entity entity-relationship ownership


    【解决方案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 也会被数据库自动删除。

    默认选项“删除限制”将防止父行在子行存在时被删除。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-23
      • 2011-08-11
      • 2013-10-29
      • 1970-01-01
      • 2015-02-21
      • 2023-04-05
      • 2015-06-12
      • 2020-07-24
      相关资源
      最近更新 更多