Sql数据库设计层次结构

Sql数据库设计层次结构,sql,postgresql,database-design,hierarchical-data,Sql,Postgresql,Database Design,Hierarchical Data,我的任务是创建一个应用程序来跟踪我们的合同。我计划使用Django和PostgreSQL 我们现有的数据是Excel,共52行 我在文件中发现了一个层次结构模式,它包含如下内容 任职 注册办事处 运营办公室 例如,控股办公室(公司)可以包含一个以上的注册办公室(公司),反过来,注册办公室(公司)可以包含一个以上的运营办公室(公司) 首先,我想我可以创建3个表,并使用PK和FK映射它们。但是,如果将来他们想将层次结构从3更改为4或5,该怎么办?我如何设计一个数据库来实现同样的目标。这通常是使用一种

我的任务是创建一个应用程序来跟踪我们的合同。我计划使用Django和PostgreSQL

我们现有的数据是Excel,共52行

我在文件中发现了一个层次结构模式,它包含如下内容

  • 任职
  • 注册办事处
  • 运营办公室
  • 例如,控股办公室(公司)可以包含一个以上的注册办公室(公司),反过来,注册办公室(公司)可以包含一个以上的运营办公室(公司)


    首先,我想我可以创建3个表,并使用PK和FK映射它们。但是,如果将来他们想将层次结构从3更改为4或5,该怎么办?我如何设计一个数据库来实现同样的目标。

    这通常是使用一种称为

    请注意,
    parent\u office\u id
    可为空,表示“无父项”

    然后,您可以构建如下结构:

    insert into office (office_id, office_name, parent_office_id)
    values
    (1, 'Holding Office', null),
    (2, 'Registered Office One', 1),
    (3, 'Registered Office Two', 1),
    (4, 'Operating Office One', 2),
    (5, 'Operating Office Two', 2),
    (6, 'Operating Office Three', 3);
    

    你可以使用一个简单的工具获得所有的“儿童”办公室。这里有一个关于Stackoverflow的例子。

    这里有一些权衡——甚至有一个(非常好的)概述了这些选项

    @一匹没有名字的马给人最多的感觉

    此模型的好处是,您不需要将关系的性质硬连接到数据模型中。当你找到一个没有控股公司的注册办事处时,你不需要取消选择你的“3表”模型来适应它。您可以包含一个“office类型”列,这样您的UI就可以显示office类型,而无需从关系中进行推断

    其他好处是,改变层级结构很容易——注册办事处可以很容易地转移到另一家控股公司及其所有子公司


    缺点是您无法轻松地在数据模型中强制执行业务规则。如果有一条业务规则规定“所有注册办事处必须只属于一个注册办事处”,则不能创建引用完整性约束来强制执行该规则。

    非常感谢您的解释非常感谢您的解释
    insert into office (office_id, office_name, parent_office_id)
    values
    (1, 'Holding Office', null),
    (2, 'Registered Office One', 1),
    (3, 'Registered Office Two', 1),
    (4, 'Operating Office One', 2),
    (5, 'Operating Office Two', 2),
    (6, 'Operating Office Three', 3);