Sql 数据库设计层次结构

Sql Database design hierarchy

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

我们现有的数据在 Excel 中,共 52 行。

我在包含以下内容的文件中找到了层次结构模式

  1. 在职
  2. 注册办事处
  3. 运营办公室

例如 - 控股办事处(公司)可以包含一个以上的注册办事处(公司),而注册办事处(公司)又可以包含一个以上的运营办事处(公司)。

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

这通常使用称为 "adjacency list model" 的模式来完成。

create table office
(
  office_id integer primary key, 
  office_name varchar(50) not null unique,
  parent_office_id integer references office
);

请注意 parent_office_id 可以为 null,表示“无父项”。

然后您可以像这样构建结构:

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

您可以在 Whosebug 上使用 recursive query. There are a lot of examples 获取所有“子”办公室。

这里有一些权衡取舍 - 甚至有一个(非常好)book 概述了选项。

@a_horse_with_no_name给出最多.

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

其他好处是更改层次结构很容易 - 注册办事处可以很容易地转移到另一家控股公司,连同它的所有子公司。

缺点是您无法轻松地在数据模型中执行业务规则。如果有一条业务规则规定“所有注册办公室必须恰好属于一个注册办公室”​​,则您无法创建参照完整性约束来强制执行该规则。